C# 快速将数据写入 Excel 单元格

这篇具有很好参考价值的文章主要介绍了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元素结构及写入原理

元素结构如下图:

c# 文本框内容输入excel,微软Office计算中心,c#,开发语言,microsoft,excel,.net

其中Range对象,代表了Excel单元格集合的指定区域。

c# 文本框内容输入excel,微软Office计算中心,c#,开发语言,microsoft,excel,.net

如图选中的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》进行处理和配置。

实现代码

组件库引入

c# 文本框内容输入excel,微软Office计算中心,c#,开发语言,microsoft,excel,.net

核心代码

WriteArrayToExcel

public void WriteArrayToExcel(object[,] dataobj,ExcelApplication excel,int ActiveSheetId,int StartRowId,int StartColId),该方法参数说明见下表:

序号 参数 说明
1 object[,] dataobj 传递要写入的二维对象数组
2 ExcelApplication excel 表示Excel应用程序对象
3 int ActiveSheetId 指定要写入哪个工作ID,ID从1开始
4 int StartRowId 指定要写入的开始行ID,ID从1开始
5 int 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单元格的关键方法,这里仅作参考,欢迎大家评论指教!文章来源地址https://www.toymoban.com/news/detail-852720.html

到了这里,关于C# 快速将数据写入 Excel 单元格的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#基础:用ClosedXML实现Excel写入

    直接在控制台输出,确保安装了该第三方库 实现效果:

    2024年01月24日
    浏览(32)
  • C#【必备技能篇】使用NPOI实现对excel的读取和写入

    依次执行下图中的1-6按钮 , 可以通过查看程序文件夹中的excel文件来加深理解。 链接:https://pan.baidu.com/s/19PgQMhCKviw9aBAjmJHSww 提取码:2omi 需要在源码中增加如下引用。相应的dll已更新到 5 的下载地址中。

    2023年04月13日
    浏览(41)
  • c#关于文件夹/文件/文本读取遍历,写入还有表格的读取的一些方法

    c#遍历文件夹下的各种文件 将一些log写入到文本文件中: fs.Seek(offset, whence);移动文件读取的指针到指定位置 offset:开始的偏移量,也就是代表需要移动偏移的字节数 whence:给offset参数一个定义,表示要从哪个位置开始偏移;0代表从文件开头开始算起,1代表从当前位置开始

    2024年02月01日
    浏览(59)
  • C# WPF读取文本内容的7种方式

    C#读取文本内容的7种方式 代码如下(示例): 代码如下(示例): (1)打开文件 (2)第一种:基于FileStream,并结合它的Read方法读取指定的字节数组,最后转换成字符串进行显示。 (3)第二种:基于FileStream,一个字节一个字节读取,放到字节数组中,最后转换成字符串

    2024年02月08日
    浏览(31)
  • C#修改富文本框(RichTextBox)指定内容颜色

    最近给客户做了一个协议解包与组包的工具,以便于他们给终端客户或者集成商使用,让客户能够快速集成产品协议,降低客户集成工作量,产品协议是基于JT/T808,但是有增加了自己的一些特殊修改。 客户使用的是C#开发的网关,所以我就基于C#做了一个开发包以及测试工具

    2023年04月15日
    浏览(36)
  • C# 快速写入日志 不卡线程 生产者 消费者模式

    有这样一种场景需求,就是某个方法,对耗时要求很高,但是又要记录日志到数据库便于分析,由于访问数据库基本都要几十毫秒,可在方法里写入BlockingCollection,由另外的线程写入数据库。 可以看到,在我的机子上面,1ms写入了43条日志。

    2024年02月15日
    浏览(55)
  • C#小轮子:MiniExcel,快速操作Excel

    Excel的操作是我们最常用的操作,Excel相当于一个小型的数据库,目的是为了方便查看。 最近淘到了MiniExcel,简单来说就是特别好用 MiniExcel Github仓库 Visual Studio 2022 .NET Core 6.0 Nuget MiniExcel Newtonsoft.Json(方便查看数据) 普通读写就是列名和实体类完全一致 读 新建Person测试类 新建

    2024年02月12日
    浏览(39)
  • C# WinForm 使用Microsoft.Office.Interop.Excel对Excel文件表格的单元格值进行修改操作

    在引用位置点击右键 点击管理NUGet程序包 搜索Excel,在搜索结果中点击Microsoft.Office.Interop.Excel 然后点击安装即可,搜不到的话,在右侧程序包源位置改成全部再次搜索 。 对准项目,点击右键,在弹出菜单选择添加,选择类 类名称随意,然后清空新建类得到全部内容,把下面

    2024年02月13日
    浏览(58)
  • 记一次排查:接口返回值写入excel后,从单元格copy出来的数据会带有多重引号的问题

    在项目里刚好有3个服务,同一个网关内层的3个服务,两个php的,一个golang的,为了提高负载以及进行分流,部分客户的接口调用会被网关自动分配到go服务。 恰好为了测试,我写了一个全量用户的生产、测试环境调用接口返回结果进行对比的脚本,于是发现了题中的问题:

    2024年02月05日
    浏览(43)
  • excel快速选择数据、选择性粘贴、冻结单元格

    一、如何快速选择数据 在excel中,希望选择全部数据,通常使用鼠标选择数据然后往下拉,当数据很多时,也可单击单元格使用ctrl + A选中全部数据,此外,具体介绍另一种方法。 操作:ctrl + shift + 方向箭头 1、优点:可以快速选择规模较大的区域数据 2、缺点:如果起始行或

    2024年02月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包