关于读取其它工作簿数据的几个方式的比较:
1、VBA的GetObject方法,会调用Excel程序打开工作簿(虽然不可见,但确实是打开的)
2、SQL,使用繁琐缺少灵活,不支持单元格样式的操作,也似乎不支持delete语句删除源数据。
3、使用Open XML SDK,基于Open XML,不依赖于Excel程序,但步骤繁琐。
4、Epplus,基于OpenXML,简单灵活,不依赖Excel程序打开工作簿,处理数据的速度快。
下载:Epplus,引用Epplus,然后 using OfficeOpenXml
样例工作簿:
创建对象,构造函数接收一个FileInfo对象
1 string path = @"E:\studyvs\open xml\2.xlsx"; 2 FileInfo info = new FileInfo(path); 3 ExcelPackage doc = new ExcelPackage(info);
要新建一个工作簿,工作簿至少要有一个工作表
1 string path = @"E:\studyvs\open xml\333.xlsx"; 2 if (File.Exists(path)) 3 { 4 File.Delete(path); 5 } 6 FileInfo info = new FileInfo(path); 7 ExcelPackage doc = new ExcelPackage(info); 8 doc.Workbook.Worksheets.Add("mySheet"); 9 doc.Save();
遍历工作簿中的工作表
1 string path = @"E:\studyvs\open xml\2.xlsx"; 2 FileInfo info = new FileInfo(path); 3 ExcelPackage doc = new ExcelPackage(info); 4 ExcelWorksheets sheets = doc.Workbook.Worksheets; 5 //Worksheets[i]的索引可以是工作表name,也可以是工作表在工作簿中的排列位置 6 for (int i = 1; i <= sheets.Count; i++) 7 { 8 string s = string.Format("PositonID是{0}的工作表名称是{1}", i.ToString(), sheets[i].Name); 9 System.Windows.Forms.MessageBox.Show(s); 10 }
使用foreach
1 foreach (ExcelWorksheet sheet in sheets) 2 { 3 string s = string.Format("第{0}个工作表名称是{1}", sheet.Index, sheet.Name); 4 System.Windows.Forms.MessageBox.Show(s); 5 }
以上两种方式对工作表的输出顺序是完成相同的,依次是:mySheet、sheet1,4,3,2
支持Linq
ExcelWorksheet sheet= sheets.Single(s => s.Name == "mySheet")
引用单元格
1 //使用的单元格区域地址 2 string address = sheet.Dimension.Address; 3 //最大行数 4 int maxrow = sheet.Dimension.Rows; 5 //最大列数 6 int maxcolumn = sheet.Dimension.Columns; 7 //已使用的单元格区域 8 ExcelRange usedrange = sheet.Cells; 9 //单元格A1 10 ExcelRange cell1 = sheet.Cells["A1"]; 11 //第一个单元格 12 ExcelRange cell2 = sheet.Cells[1, 1]; 13 //区域A1:E5 14 ExcelRange range1 = sheet.Cells["A1:E5"]; 15 //区域A1:E5 16 ExcelRange range2 = sheet.Cells[1, 1, 5, 5];
取得单元格的值
1 //单元格的值 2 object value = sheet.Cells[1, 1].Value; 3 //获得单元格的强类型值 4 string name = sheet.Cells[1, 1].GetValue<string>(); 5 double age = sheet.Cells[2, 2].GetValue<double>(); 6 //区域的值是二维数组 7 object[,] values = (object[,])sheet.Cells.Value;
取得目标区域的值并赋值给当前活动工作表
1 object[,] values = (object[,])sheet.Cells.Value; 2 //Globas.Sheet1获了文档级项目的Sheet1工作表;数组的维度从0开始 3 Range rng = Globals.Sheet1.Range["A1"].Resize[values.GetUpperBound(0)+1,values.GetUpperBound(1)+1]; 4 rng.Value = values;
合并同一目录下的所有工作簿:
将同一个文件夹下的工作簿中的第一张工作表(当然也可以是所有工作表,本例只取一个)合并到新的工作簿text.xlsx中。
1 string path = @"E:\studyvs\open xml\test.xlsx"; 2 FileInfo info = new FileInfo(path); 3 //要合并到的工作簿 4 ExcelPackage doc = new ExcelPackage(info); 5 int i = 1; 6 foreach (string excel in Directory.GetFiles(@"E:\studyvs\open xml\")) 7 { 8 //using帮助释放资源 9 using (ExcelPackage p = new ExcelPackage(new FileInfo(excel))) 10 { 11 ExcelWorksheet sheet = p.Workbook.Worksheets.First(); 12 doc.Workbook.Worksheets.Add(i.ToString(), sheet); 13 i++; 14 } 15 } 16 //保存工作簿 17 doc.Save(); 18 System.Windows.Forms.MessageBox.Show("合并成功");
时间: 2024-12-09 18:31:14