首页 > 代码库 > 使用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