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单元格的关键方法,这里仅作参考,欢迎大家评论指教!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java与Go:文件IO

在软件开发中&#xff0c;文件IO是一项基本任务&#xff0c;涉及到从文件读取数据、向文件写入数据以及处理文件相关的异常等操作。在这篇文章中&#xff0c;我们将专注于比较两种流行的编程语言&#xff1a;Java和Go&#xff0c;在文件IO方面的异同点。 文件的打开与关闭 文…

uniapp实现单选组件覆盖选中样式

uniapp实现单选组件覆盖选中样式 完整代码&#xff1a; <!-- 是否选择组件: trueOfFalseChooseBtn --> <template><view class"is-true-body"><view class"btn-con" :class"isTrue ? btn-con-active : " click"clic…

Prototype

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网. 题目&#xff1a; 样例&#xff1a; 输入 168 输出 42 思路&#xff1a; 根据题意&#xff0c; 吸收怪物是 w * n &#xff0c;其中 怪物 n 一定是质数&#xff0c;并且 AlexMercer 可以变成 w 的任一因子。 从中…

《安富莱嵌入式周报》第335期:大量嵌入式书籍免费下载,CNC电机同步,智能家居比赛作品,EMF2024电子胸牌,Swift语言单片机编程,UDS Boot

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频版&#xff1a; https://www.bilibili.com/video/BV151421Q7P4/ 《安富莱嵌入式周报》第335期&#xff1a;大量嵌入…

Python数据分析师工资怎么样?

在大数据时代&#xff0c;提到数据分析&#xff0c;就不得不提到Python&#xff0c;作为一门编程语言&#xff0c;Python用于数据分析时&#xff0c;能够带来很多的优势&#xff0c;这也是Python数据分析师现在受到欢迎的原因。Python数据分析师受到欢迎&#xff0c;相应地能够…

稀碎从零算法笔记Day26-LeetCode:跳跃游戏

断更多天&#xff0c;懒狗ex 题型&#xff1a;数组、模拟、类似双指针&#xff1f; 链接&#xff1a;55. 跳跃游戏 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组…

【漏洞复现】MaxView系统dynamiccontent.properties接口处存在RCE漏洞

免责声明&#xff1a;文章来源互联网收集整理&#xff0c;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;所产生的一切不良后果与文章作者无关。该…

如何使用route-detect在Web应用程序路由中扫描身份认证和授权漏洞

关于route-detect route-detect是一款功能强大的Web应用程序路由安全扫描工具&#xff0c;该工具可以帮助广大研究人员在Web应用程序路由中轻松识别和检测身份认证漏洞和授权漏洞。 Web应用程序HTTP路由中的身份认证&#xff08;authn&#xff09;和授权&#xff08;authz&…

C语言_第一轮笔记_指针

8.1 密码开锁 地址和指针 一般以变量所在的内存单元的第一个字节的地址作为他的地址NULL的值为0&#xff0c;代表空指针 指针变量的定义 类型名 *指针变量名类型名指定指针变量所指向变量的类型指针声明符*在定义指针变量时被使用&#xff0c;说明被定义的那个变量是指针指针变…

44 el-dialog 的 appendToBody 属性, 导致 vue 响应式失效

前言 我们经常会碰到 一些 模型和视图 不同步的问题 通常意义上 主要的问题为 列表的某响应式数据更新着更新着 后面就变成非响应式对象了, 然后 就造成了 数据一直在更新, 但是 视图的渲染后面就未渲染了, 这是一个由于 模型上的问题 导致的数据的不在响应式更新 又或者 是…

这些好玩的Ai网站你不知道我真的会哭

你可能想不到&#xff0c;AI已经发展到了这个程度。。文末提供 AI绘画关键词哦 目录 1.Midjourney 2.DeepFakes 3.StyleGAN 4.Runway AI绘画关键词哦 1.Midjourney Midjourney 是一款工具&#xff0c;更像是一位魔术师&#xff0c;但它的魔法来自人工智能技术的神奇。…

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动&#xff0c;我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本&#xff0c;下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

P6学习:解析P6 WBS-工作分解结构的原则

前言 WBS&#xff0c;及Work Breakdown Structure&#xff0c;中文工作分解结构&#xff0c;是总结工作阶段的项目的层次结构分解。 WBS 就像项目的大纲——它将项目分解为特定的可交付成果或阶段。 然后将活动添加到这些层中以创建项目计划的时间表。 WBS 使用流程会有所不…

Hack The Box-Reminiscent

目录 基本信息 Resume.eml文件 imageinfo.txt flounder-pc-memdump.elf 检查内存镜像 进程 文件 get flag base64解码 基本信息 Resume.eml文件 ┌──(root㉿ru)-[~/…/ctf_quzheng_tools/timu/hackthebox/reminiscent] └─# cat Resume.eml Return-Path: <blood…

【4月】组队打卡《山有木Python特征工程极简入门》

活动名称 CDA Club 第2期《山有木兮Python数据分析极简入门》组队打卡 活动介绍 本次打卡活动由CDA俱乐部旗下学术部主办。目的是通过数据分析科普内容&#xff0c;为数据分析爱好者提供学习和交流的机会。方便大家利用碎片化时间在线学习&#xff0c;以组队打卡的形式提升学…

Transformer的前世今生 day08(Positional Encoding)

前情提要 Attention的优点&#xff1a;解决了长序列依赖问题&#xff0c;可以并行。Attention的缺点&#xff1a;开销变大了&#xff0c;而且不存在位置关系为了解决Attention中不存在位置关系的缺点&#xff0c;我们通过位置编码的形式加上位置关系 Positional Encoding&…

独享IP可以避免被封禁或限制访问的风险

在一些网站或服务中&#xff0c;存在对共享IP的封禁或限制访问的情况&#xff0c;这给用户带来了不便。而使用独享IP可以有效规避这一问题&#xff0c;保障用户正常访问需求。例如&#xff0c;在进行搜索引擎优化、社交媒体营销或广告投放时&#xff0c;独享IP可以确保用户的网…

第二证券策略:关注工程机械、新能源以及金融等行业的投资机会

第二证券认为&#xff0c;近来商场表现为高位题材股分解加剧呈现退潮痕迹&#xff0c;短期获利回吐压力较高&#xff0c;商场风格进行凹凸切换。人民币汇率短期呈现动摇&#xff0c;汇率商场呈现短期不合&#xff0c;但随着我国经济根本面预期的改进&#xff0c;外汇商场表现或…

SpringMVC面试题

1、SpringMVC执行流程 [参考内容&#xff1a;SpringMVC的执行流程] 2、常用注解及作用 2.1 Controller 名称&#xff1a;Controller类型&#xff1a;类注解位置&#xff1a;SpringMVC控制器类定义上方作用&#xff1a;设定SpringMVC的核心控制器bean范例 Controller publi…

【C++教程从0到1入门编程】第十三篇:STL中list类的模拟实现

一、list的模拟实现 #include<iostream> #include<assert.h> #pragma once namespace jyr {template<class T>struct _list_node{_list_node<T>* _next;_list_node<T>* _prev;T _data;_list_node(const T& val T()):_next(nullptr), _prev(…