淘宝网站建设目标是什么,青岛网上房地产官网,福州解封最新消息,免费申请网站 免备案目录
性能问题
Excel元素结构及写入原理
范例运行环境
配置Office DCOM
实现代码
组件库引入
核心代码
WriteArrayToExcel
神奇的 911 事件
小结 性能问题
将生成或查询到的数据#xff0c;导出到 Excel 是应用中常用的一项功能。其中一些标准的写入单元格的方法如…目录
性能问题
Excel元素结构及写入原理
范例运行环境
配置Office DCOM
实现代码
组件库引入
核心代码
WriteArrayToExcel
神奇的 911 事件
小结 性能问题
将生成或查询到的数据导出到 Excel 是应用中常用的一项功能。其中一些标准的写入单元格的方法如下
Worksheet worksheet (Worksheet) excel.Worksheets[1];//引用坐标对Cells集合进行写入worksheet.Cells[1, 1] test;//还可以引用地址进行写入worksheet.Cells[A1,Type.Missing]test;
请注意office 元素大多的起始序号均从 1 开始而不是 0如 worksheetcells等。
现在我们假设有二维数组 object[,] dataobj 遍历式的写法如下
int arraywidthdataobj.GetLength(1);
int arrayheightdataobj.GetLength(0);
Worksheet worksheet (Worksheet) excel.Worksheets[1];for(int j0;jarrayheight;j)
{for(int k0;karraywidth;k){worksheet.Cells[j1,k1]dataobj[j,k]; }//end columns
}// end rows 此种写法在数据较少的时候在写入速度方面没有明显差异但当大数据量的情况多次的读写CELL单元格 IO 是一项非常耗时的操作甚至会无法完成应用的预期目标。
Excel元素结构及写入原理
元素结构如下图 其中Range对象代表了Excel单元格集合的指定区域。 如图选中的Range范围起始的单元格是第5行第3列结束于第17行第8列。它相当于object[13,6] 的一个二维数组Excel的Range提供了get_Resize方法并通过Value2可以一次性的设置它们。 范例运行环境
操作系统 Windows Server 2019 DataCenter
操作系统上安装 Office Excel 2016
.net版本 .netFramework4.7.1 或以上
开发工具VS2019 C#
配置Office DCOM
配置方法可参照我的文章《C# 读取Word表格到DataSet》进行处理和配置。
实现代码
组件库引入 核心代码
WriteArrayToExcel
public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId),该方法参数说明见下表
序号参数说明1object[,] dataobj传递要写入的二维对象数组2ExcelApplication excel表示Excel应用程序对象3int ActiveSheetId指定要写入哪个工作IDID从1开始4int StartRowId指定要写入的开始行IDID从1开始5int StartColId指定要写入的开始列IDID从1开始 示例代码如下
public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId)
{Excel.Range _range;int arraywidthdataobj.GetLength(1);int arrayheightdataobj.GetLength(0);Worksheet worksheet (Worksheet) excel.Worksheets[ActiveSheetId];worksheet.Activate();_rangeexcel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowIdarrayheight-1,StartColIdarraywidth-1]];_range.get_Resize(arrayheight,arraywidth);_range.Value2dataobj;} //end writearraytoexcel神奇的 911 事件
在 Excel 的早期版本如Excel 2003写入的时我们发现了一个现象每写入第 911个单元格的时候且第911个单元数据为字符串类型的时候会出现无响应的情况。当时的解决方案是将原始数组的每911元素值进行备份并设置为空字符串然后再对Cells单元格进行重写修改后的代码如下
public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId){Excel.Range _range;int arraywidthdataobj.GetLength(1);int arrayheightdataobj.GetLength(0);Worksheet worksheet (Worksheet) excel.Worksheets[ActiveSheetId];worksheet.Activate();ArrayList ex_x new ArrayList();ArrayList ex_y new ArrayList();ArrayList ex_value new ArrayList();object _fvalue;int _maxlen910; for(int j0;jarrayheight;j){for(int k0;karraywidth;k){_fvaluedataobj[j,k];// field value
//备份每个第911个单元数据if(_fvalue.GetType().ToString()System.String){if(((string)_fvalue).Length_maxlen){ex_x.Add(jStartRowId);ex_y.Add(kStartColId);ex_value.Add(_fvalue);_fvalue;}// end maxlen }dataobj[j,k]_fvalue;}//end columns}// end rows _rangeexcel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowIdarrayheight-1,StartColIdarraywidth-1]];_range.get_Resize(arrayheight,arraywidth);_range.Value2dataobj;
//恢复重写对应的单元格for(int j0;jex_value.Count;j){excel.Cells[ex_x[j],ex_y[j]]ex_value[j].ToString();}
} //end writearraytoexcel小结
1、911单元格处理的方法是一种兼容性写法我们可以根据安装的版本来决定是否需要这种写法。
2、核心方法中输入的起始行列可以修改为更加直观的CELL地址如“A1”,B5等有助于客户进行应用提升友好性。
3、我们还可以改造传递二维数组集合写入多个worksheet满足更多需求提升应用程序的功能。
这些代码我们提供了一些写入Excel单元格的关键方法这里仅作参考欢迎大家评论指教