首页 > 代码库 > 使用Open Xml按模版导出Excel文件(下)
使用Open Xml按模版导出Excel文件(下)
(3)将数据写入Excel
把数据写入到Excel文件是本文的关键技术。这里需要用到OpenXml。在Sdk里已经提供了足够的文件操作方法,我们就调用这些方法,将数据源的数据写到文件中。
首先我们定义了一些工具类,用于读取单元格的行列值。
在Excel中,每个单元格都有一个地址:如B3表示第二行第三列的格子,在Utility中的GetRowIndex和GetColumnIndex就是输入字符串”B3”,返回Int类型的索引2 和3。还有输入“B3”,返回列的字母“B”等等。
在WorkSheetExtend类中定义根据行列索引写单元格文字和数值的方法。
首先根据行列值可以查询到指定单元格
1 2 3 4 5 6 7 8 9 10 11 12 | private static Excel.Cell GetCell( this Excel.Worksheet worksheet, string columnName, uint rowIndex) { Excel.Row row = GetRow(worksheet, rowIndex); if (row == null ) return null ; return row.Elements().Where(c => string .Compare (c.CellReference.Value, columnName + rowIndex, true ) == 0).First(); } |
将单元格的Value值设定为数据源的值即可,如设置为字符串形值
1 2 3 4 5 6 7 8 | public static void UpdateCell( this Excel.Worksheet worksheet, string col, uint row, string text) { var cell = GetCell(worksheet, col, row); cell.CellValue = new Excel.CellValue(text); cell.DataType = new EnumValue(Excel.CellValues.String); } |
可以看到设定固定行列单元格的值非常容易,查找到单元格,设置单元格的CellValue属性,并设定其DataType。
如果在页签里插入一行数据,就麻烦一些了。
首先要确定要插入行的格式和位置,根据上面NameRange定义R_tablename的区域是模版,根据模版的行索引确定该行,复制改行的单元格得到新的一行。
新增一样的方法,
1 2 3 4 5 6 7 | Var newRow= new Excel.Row() { RowIndex = refRow.RowIndex.Value }; foreach (Excel.Cell cell in cells) { Excel.Cell newCell = (Excel.Cell)cell.CloneNode( true ); newCell.StyleIndex = new UInt32Value(cell.StyleIndex); newRow.Append(newCell); } |
将新增行的行索引设置为模版的行索引,将新的行插入到模版的位置,同时模版以下行内的单元格索引都要同时加上1。
最后处理MergeCell合并单元格,修改行索引为最新值,如果模版行里有MergeCell,那在插入的新行里也要增加合并单元格。
由于每个单元格里都要行的引用,所以插入一行后需要处理的内容还是蛮多的。
(4)写完数据后保存,就得到最终的Excel文件。这里特别说明的是,我在导出前将所有的公式删除掉,因为在新增行的时候,公式对单元格的引用会混乱。如果要保留公式,一定要像处理合并单元格一样,处理好公式引用。
demo下载:http://www.iyummy.com.cn/Blog/Detail/4