C# 快速将数据写入 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,如 worksheet,cells等。

现在我们假设有二维数组  object[,] dataobj ,遍历式的写法如下:

int arraywidth=dataobj.GetLength(1);
int arrayheight=dataobj.GetLength(0);
Worksheet worksheet = (Worksheet) excel.Worksheets[1];for(int j=0;j<arrayheight;j++)
{for(int k=0;k<arraywidth;k++){worksheet.Cells[j+1,k+1]=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指定要写入哪个工作ID,ID从1开始
4int StartRowId指定要写入的开始行ID,ID从1开始
5int StartColId指定要写入的开始列ID,ID从1开始

示例代码如下:

public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId)
{Excel.Range _range;int arraywidth=dataobj.GetLength(1);int arrayheight=dataobj.GetLength(0);Worksheet worksheet = (Worksheet) excel.Worksheets[ActiveSheetId];worksheet.Activate();_range=excel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowId+arrayheight-1,StartColId+arraywidth-1]];_range.get_Resize(arrayheight,arraywidth);_range.Value2=dataobj;} //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 arraywidth=dataobj.GetLength(1);int arrayheight=dataobj.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 _maxlen=910;				for(int j=0;j<arrayheight;j++){for(int k=0;k<arraywidth;k++){_fvalue=dataobj[j,k];// field value
//备份每个第911个单元数据if(_fvalue.GetType().ToString()=="System.String"){if(((string)_fvalue).Length>_maxlen){ex_x.Add(j+StartRowId);ex_y.Add(k+StartColId);ex_value.Add(_fvalue);_fvalue="";}// end maxlen }dataobj[j,k]=_fvalue;}//end columns}// end rows _range=excel.Range[excel.Cells[StartRowId,StartColId],excel.Cells[StartRowId+arrayheight-1,StartColId+arraywidth-1]];_range.get_Resize(arrayheight,arraywidth);_range.Value2=dataobj;
//恢复重写对应的单元格for(int j=0;j<ex_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单元格的关键方法,这里仅作参考,欢迎大家评论指教!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/773538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据库学习案例20240326-mysql主从复制对trigger,event是否会导致数据重复测试

1 MASTER -SLAVE TRRGER测试 binlog_formatROW 测试环境为master-master双主模式&#xff0c;配置的双向复制。 11:25: [(none)]> show variables like %binlog_format%; ---------------------- | Variable_name | Value | ---------------------- | binlog_format | RO…

智慧公厕,让数据和技术更好服务社会生活

智慧公厕&#xff0c;作为智慧城市建设中不可忽视的一部分&#xff0c;正逐渐受到越来越多人的关注。随着科技的不断进步&#xff0c;智能化公厕已经成为一种趋势&#xff0c;通过数据的流转和技术的整合&#xff0c;为社会生活带来了更好的服务。本文以智慧公厕源头实力厂家广…

基于51单片机的酒精检测警报系统Proteus仿真

地址&#xff1a;https://pan.baidu.com/s/1gddplAxS_ZKyrHaWE93dog 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52简介&#xff1a; AT89C52是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectronics&#xff09;公…

最新的Flutter3.x版本获取应用包名的方法

以前的flutter项目可以在 AndroidManifest.xml 中获取应用包名&#xff0c; 最新的Flutter3.x版本要获取应用包名可以找到build.gradle 更多内容参考&#xff1a;最新的Flutter3.x版本如何获取应用包名

Linux:Jenkins全自动持续集成持续部署(4)

在上一章部署好了之后&#xff0c;还需要点击一下才能进行部署&#xff0c;本章的效果是&#xff1a;当gitlab上的代码发生了变化后&#xff0c;我们不需要做任何事情不需要去点击构建按钮&#xff0c;Jenkins直接自动检测变化&#xff0c;然后自动去集成部署Linux&#xff1a;…

(一)手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核

&#xff08;一&#xff09;手把手教你如何通过ARM DesignStart计划在FPGA上搭建一个Cortex-M3软核 一、ARM DesignStart计划 1.1 如何下载ARM DesignStart Cortex-M3相关文件 ​ 关于ARM DesignStart计划的介绍:ARM DesignStart计划——私人定制一颗ARM处理器 - 知乎 (zhih…

go中validate包使用教程

文章目录 前言安装简单使用错误处理翻译器Validator库介绍校验语法常用标记自定义校验需求【校验车身颜色】前言 在go项目中,经常有校验数据合法性的需求,比如邮箱、年龄、车牌号、网址、字符串长度、金额、枚举范围等。一个好的校验包能帮我们少写很多ifelse,提高系统的可…

docker在线安装centos7(windows版)

目录 1、docker本地安装2、拉取centos7镜像3、启动容器4、配置SSH以访问centos7 1、docker本地安装 windows安装docker比较简单&#xff0c;官网搜索有个docker desktop装上就完事。 2、拉取centos7镜像 可以登录到docker hub上拉&#xff0c;也可以搜出来对应的centos7镜像…

sqlite删除数据表

1.如何删除表 在SQLite中&#xff0c;删除表的SQL语句是DROP TABLE。如果你想要在Python中使用SQLite库&#xff08;如sqlite3&#xff09;来删除一个表&#xff0c;你可以按照以下步骤操作&#xff1a; 连接到SQLite数据库。创建一个cursor对象。执行DROP TABLE语句。提交事…

Kindling the Darkness:A Practical Low-light Image Enhancer

Abstract 在弱光条件下拍摄的图像通常会出现&#xff08;部分&#xff09;可见度较差的情况。,除了令人不满意的照明之外&#xff0c;多种类型的退化也隐藏在黑暗中&#xff0c;例如由于相机质量有限而导致的噪点和颜色失真。,换句话说&#xff0c;仅仅调高黑暗区域的亮度将不…

蓝桥杯练习系统(算法训练)ALGO-966 自行车停放

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 有n辆自行车依次来到停车棚&#xff0c;除了第一辆自行车外&#xff0c;每辆自行车都会恰好停放在已经在停车棚里的某辆自行…

对标开源3D建模软件blender,基于web提供元宇宙3D建模能力的dtns.network德塔世界是否更胜一筹?

对标开源3D建模软件blender&#xff0c;基于web提供元宇宙3D建模能力的dtns.network德塔世界是否更胜一筹&#xff1f; blender是一款优秀的3D建模开源软件&#xff0c;拥有免费开源、功能强大、渲染速度优秀的优点。而开源的dtns.network德塔世界&#xff0c;亦是专业级的元宇…

3D程序中保证交互流畅性的常用技巧-备忘

opengl绘制一帧会绘制场景中会有多个模型&#xff0c;随着模型三角面片数量增加&#xff0c;GPU绘制一帧就会变慢&#xff0c;这将不能快速响应鼠标消息&#xff0c;例如鼠标旋转缩放视图&#xff0c;所以出现了很多牺退而求其次的交互技术&#xff0c;例如LOD技术&#xff0c;…

spring boot项目对接阿里云的RocketMq5

要在Spring Boot项目中实现一个通用的消息消费服务&#xff0c;可以将前面的概念整合并利用Spring的依赖注入特性来创建一个更灵活、可配置的服务。下面是如何创建这样的服务&#xff0c;包括通过application.properties来配置连接信息&#xff0c;以及使用Service注解定义消费…

【手写AI代码目录】准备发布的教程

文章目录 1. tensorboard2. F.cross_entropy(input_tensor, target) F.log_softmax() F.nll_loss() 1. tensorboard from torch.utils.tensorboard import SummaryWriter# TensorBoard writer SummaryWriter(runs/mnist_experiment_1) ...if i % 100 99: # 每 100 个 b…

FPGA之组合逻辑与时序逻辑

数字逻辑电路根据逻辑功能的不同&#xff0c;可以分成两大类&#xff1a;组合逻辑电路和时序逻辑电路&#xff0c;这两种电路结构是FPGA编程常用到的&#xff0c;掌握这两种电路结构是学习FPGA的基本要求。 1.组合逻辑电路 组合逻辑电路概念&#xff1a;任意时刻的输出仅仅取决…

2024年福建事业单位招聘详细流程

2024年福建事业单位招聘详细流程&#xff0c;速速查收&#xff01;

Linux C++ 006-函数

Linux C 006-函数 本节关键字&#xff1a;Linux、C、函数 相关库函数&#xff1a; 概述 作用是将一段经常使用的代码封装起来&#xff0c;减少重复代码 函数的定义 返回值类型 函数名(参数列表) {函数体语句;return 表达式; }例如&#xff1a; int func(int a, int b) {in…

使用Nginx1.25.4版本做负载均衡、搭建Nacos2.3.0服务集群

关于使用版本问题上&#xff0c;其实小白更喜欢使用新的版本&#xff0c;因为新的版本功能更多&#xff0c;肯定优化方面不言而喻&#xff0c;懂得都懂&#xff0c;但是新的版本&#xff0c;肯定使用起来更加的速度&#xff0c;性能&#xff0c;也是不言而喻的啊&#xff0c;那…

US-T65 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 一些常见问题解答&#xff08;FAQ&#xff09;注意首次使用步骤蓝牙配对&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功能层1配置的功能默认的快捷键 蓝牙参数蓝牙MAC地址管理…