嗯,项目需要。。。
正好知道OpenXml这个东西,所以就拿过来研究了一下。
总体感觉果然是XML思想的产物,我原以为是像DataTable那样操作Excel,结果我想多了,不过还好,挺好用的,扩展性很好的说。
这个链接是微软MVA学院介绍OpenXml的简单教程
这个是OpenXml SDK的下载链接
解压之后,安装。
然后在解决方案中添加这两个引用
以下是代码
(有一点要注意,这个总结是对于向Excel模板中插入数据的,也就是必须保证Excel中有这些Element,对于向一个新的Sheet中插入数据,就必须先创建Element,再填充数据。)
首先,你要有个DataTable来填充Excel
DataTable dt = new DataTable(); dt.Columns.Add("1"); dt.Columns.Add("2"); dt.Columns.Add("3"); dt.Columns.Add("4"); dt.Columns.Add("5"); dt.Columns.Add("6"); dt.Columns.Add("7"); dt.Columns.Add("8"); dt.Columns.Add("9"); dt.Columns.Add("10"); dt.Columns.Add("11"); dt.Columns.Add("12"); for (int i = 0; i < 3; i++) { DataRow dr = dt.NewRow(); for (int j = 0; j < 12; j++) { dr[j] = i + j; } dt.Rows.Add(dr); }
然后,写个方法,传进去
public string Demo(string file, DataTable dt) { using (SpreadsheetDocument doucument = SpreadsheetDocument.Open(file, true)) //首先打开一个Excel文档,file指的是Excel的路径,后面的bool参数指的是能否修改,这里因为 //要对Excel做插入数据处理,所有为ture { IEnumerable<Sheet> s = doucument.WorkbookPart.Workbook.Descendants<Sheet>().Where(x => x.Name == "Sheet1"); //这里利用一个重要的方法Descendants<T>(),在该元素之下寻找指定子元素 //也就是在工作簿下寻找指定名称为“Sheet1”的工作页 //这里返回的是泛型IEnumerable<Sheet> WorksheetPart sheet = (WorksheetPart)doucument.WorkbookPart.GetPartById(s.First().Id); //我们要从泛型中提取第一个工作页 int q = 0;//作为行的计数 foreach (var row in sheet.Worksheet.Descendants<Row>()) //这里,利用Descendants<Row>()方法来获取所有的Row //OpenXml有一点的好处是,支持LINQ //在这里,如果我们从第三行开始插入的话可以这样写 //var row in sheet.Worksheet.Descendants<Row>().Where(c => c.RowIndex >= 3 // && c.RowIndex <= dt.Rows.Count + 3) //这样就获得了第三行到第 dt.Rows.Count + 3 行的引用集合 { if (q >= dt.Rows.Count) break; //限制行的循环不能超过dt的行数 int d = 0;//作为列的计数 foreach (Cell cell in row.Descendants<Cell>()) //循环所有的列 { if (d >= dt.Columns.Count) break; //限制列的循环不能超过dt的列数 cell.CellValue = new CellValue(dt.Rows[q][d].ToString()); //赋值,就是这么简单。。。。,如果你的需求就是这么简单的话。。。。。 d++; } q++; } sheet.Worksheet.Save(); //千万别忘了保存,要不然写了等于没写 } }
总的来说,还是要多练习,多尝试。
不过我第一次搞这个的时候,这些代码花了两三个小时,一边百度一边尝试。
其实我是想把它封装成类似
sheet[RowBeginIndex][ColumnBeginIndex].Update(dt,dt.Row.count,dt.Column.Count);
以上,以后再慢慢改吧
头好痛,没睡好...........
本文出自 “270jia40” 博客,请务必保留此出处http://270jia40.blog.51cto.com/9149400/1631330
原文地址:http://270jia40.blog.51cto.com/9149400/1631330