最近遇到了一个小任务:将界面dataGridView中的数据写入Excel表格中,并且需要实现读取Excel表格中的数据,然后更新到dataGridView控件中的功能。在这里呢,因为项目中的数据不能公开,所以我简化了dataGridView中的数据,但是表格读写功能是可以实现的。
一、这里为了新手能看的懂,下图是我窗体的布局和dataGridView初始化的数据,以及初始化dataGridView数据的代码。
public void InitDataGridView()
{
for (int i = 0; i < 2; i++)
{
dataGridView1.Rows.Add();
}
dataGridView1.Rows[0].Cells[0].Value = "张三";
dataGridView1.Rows[0].Cells[1].Value = "1111";
dataGridView1.Rows[0].Cells[2].Value = 300;
dataGridView1.Rows[1].Cells[0].Value = "李四";
dataGridView1.Rows[1].Cells[1].Value = "1112";
dataGridView1.Rows[1].Cells[2].Value = 200;
dataGridView1.Rows[2].Cells[0].Value = "王五";
dataGridView1.Rows[2].Cells[1].Value = "1113";
dataGridView1.Rows[2].Cells[2].Value = 300;
dataGridView1.Height = dataGridView1.ColumnHeadersHeight + dataGridView1.Rows.Count * dataGridView1.Rows[0].Height;
}
二、在项目中用Nuget工具下载Microsoft.Office.Interop.Excel.dll,为了方便新手,这里贴出了使用Nuget工具的方法,大神们可以跳过这一步。
右键项目名,点击“管理NuGet程序包”,选择“浏览”,输入
Microsoft.Office.Interop.Excel,最后点击下载即可(超级简单)
三、接下来就是将dataGridView 的数据写入Excel的代码啦,代码中有注释部分,如果有什么不清楚的欢迎在评论区讨论。
/// <summary>
/// 创建一个Excel表格
/// Excel中形如Cells[x][y]的写法,前面的数字是列,后面的数字是行!
/// Excel中的行、列都是从1开始的,而不是0
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_CreateExcel_Click(object sender, EventArgs e)
{
//创建一个文档实例
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
app.DisplayAlerts = false; //在程序运行时不被提示和警报消息打扰
app.Workbooks.Add(true);
app.ActiveSheet.Name = "总成绩统计表"; //工作表名
//合并单元格
Range range = app.get_Range("B2", "D2"); //合并B1~D1的位置
range.ClearComments(); //清空要合并的区域
range.MergeCells = true; //合并单元格
app.Cells[2][2].Value = "成绩统计表"; //设置单元格(刚刚合并的单元格)的内容
app.Rows[2].RowHeight = 27; //设置表格第二行的行高为27(磅)
app.Rows[2].HorizontalAlignment = XlVAlign.xlVAlignCenter; //设置表格第二行的内容居中
app.Rows[2].RowHeight = 27; //设置表格第二行的行高为27(磅)
app.Rows[2].HorizontalAlignment = XlVAlign.xlVAlignCenter; //设置表格第二行的内容居中
app.Rows[3].RowHeight = 27;
app.Rows[3].HorizontalAlignment = XlVAlign.xlVAlignCenter;
app.Rows[4].RowHeight = 27;
app.Rows[4].HorizontalAlignment = XlVAlign.xlVAlignCenter;
app.Rows[5].RowHeight = 27;
app.Rows[5].HorizontalAlignment = XlVAlign.xlVAlignCenter;
app.Rows[6].RowHeight = 27;
app.Rows[6].HorizontalAlignment = XlVAlign.xlVAlignCenter;
app.Cells[2].ColumnWidth = 9; //设置表格中第二列的列宽为9
app.Cells[3].ColumnWidth = 9;
app.Cells[4].ColumnWidth = 9;
//给表格增加边框,外部和内部都增加了
for(int i = 2; i< dataGridView1.Rows.Count + 4;i++)
{
Range range1;
range1 = app.get_Range("B" + i.ToString(), "D" + i.ToString());
range1.Borders.LineStyle = XlLineStyle.xlContinuous;
}
for (int i = 0; i < dataGridView1.Rows.Count; i++) //行
{
for (int j = 0; j < dataGridView1.Columns.Count; j++) //列
{
app.Cells[j + 2][3] = dataGridView1.Columns[j].HeaderText; //将dataGridView 中的列标题写入表格
app.Cells[j + 2][i + 4] = dataGridView1.Rows[i].Cells[j].Value; //将dataGridView 中的三行数据写入表格
}
}
try
{
//设置新建表格的保存路径以及名称
string path = "C:\\Users\\Administrator\\Desktop\\成绩表.xlsx";
app.ActiveWorkbook.SaveAs(path);
app.Quit();
app = null;
MessageBox.Show("创建表格成功");
}
catch(Exception ex)
{
MessageBox.Show("创建表格失败" + ex.Message);
}
}
四、最后就是读取Excel表格的内容,具体请看下面代码部分。
/// <summary>
/// 读Excel表格,更新dataGridView显示
/// ws.Cells[i,j] ,i是行,j是列
/// ws.Cells[i][j],i是列,j是行
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btn_ReadExcel_Click(object sender, EventArgs e)
{
OpenFileDialog openfile = new OpenFileDialog();
openfile.Filter = "Excel 文件(*.xls;*.xlsx)|*.xls;*.xlsx"; //设置删选器
openfile.Title = "打开"; //对话框表标题
openfile.RestoreDirectory = true; //下次打开的是上次选择的目录
if (openfile.ShowDialog() == DialogResult.OK)
{
object missing = System.Reflection.Missing.Value;
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
Workbook wb = null;
//以只读的形式打开Excel文件
try
{
wb = excel.Workbooks.Open(openfile.FileName, missing, true, missing, missing, missing,
missing, missing, missing, true, missing, missing, missing, missing, missing);
}
catch(Exception ex)
{
MessageBox.Show("打开表格文件失败" + ex.Message);
}
//获取第一个工作表
Worksheet ws = wb.Worksheets.get_Item(1);
int rowsint = ws.UsedRange.Cells.Rows.Count; //获取行数
int colCount = ws.UsedRange.Cells.Columns.Count;//获取列数
//将Excel表格中的值更新到Excel
//因为我在程序初始化时已经设置dataGridView了行和列标题,所以这里直接读取行的数据更新一下dataGridView即可。没有Add行和更新列标题
for (int i = 4; i <= rowsint + 1; i++) //行,从表格的第四行开始循环
{
for (int j = 2; j <= colCount + 1; j++)
{
dataGridView1.Rows[i - 4].Cells[j - 2].Value = ws.Cells[i,j].Value;
}
}
}
}
五、最后的最后,我在过程中遇到了两个问题,这里也将解决板房放在这里
问题1:创建Excel的时候出现如图所示的问题:
解决办法:原因是名为“成绩表.xlsx”的表格已经打开,关闭这个表格即可
(如果电脑不存表格,则会创建,如果存在,则直接修改表格的内容)
问题二:读取表格时出现如下图的错误
解决办法:
1、打开Excel,选择文件——选项
2、点击“加载项”,“管理”处选择“COM 加载项”,点击“转到”
3、取消“FoxitReader PDF Creator COM Add-in”的勾选
4、大功告成
六、最后的最后的最后
在Vs2019中,无法通过帮助文档查看Microsoft.Office.Interop.Excel.dll中的一些用法,这里可以去到微软的官网,查看Microsoft.Office.Interop.Excel.dll。
上述的步骤已经将全部代码都贴了出来,没有什么其他的东西。如果有想要源码的,可以直接去下载
好了,本片文章就到这里了,欢迎大家在评论区留言交流!