C# 基于DocumentFormat.OpenXml的数据导出到Excel
2023-09-11 14:15:05 时间
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
/// <summary>
/// 导出Excel
/// </summary>
public class ExcelExport : IDisposable
{
int rowCount = 0;
string sheetName = "sheet1";
SpreadsheetDocument xl;
OpenXmlWriter oxw;
WorksheetPart wsp;
/// <summary>
/// 导出Excel
/// </summary>
/// <param name="path">Excel文件名称(全路径)</param>
/// <param name="rowCount">表格列数量</param>
/// <param name="sheetName">表格名称</param>
public ExcelExport(string path, int rowCount, string sheetName = "sheet1")
{
this.rowCount = rowCount;
this.sheetName = sheetName ?? "sheet1";
xl = SpreadsheetDocument.Create(path, SpreadsheetDocumentType.Workbook);
xl.AddWorkbookPart();
wsp = xl.WorkbookPart.AddNewPart<WorksheetPart>();
oxw = OpenXmlWriter.Create(wsp);
oxw.WriteStartElement(new Worksheet());
oxw.WriteStartElement(new SheetData());
}
/// <summary>
/// 写入表格数据
/// </summary>
/// <param name="datas"></param>
public void Write(object[] datas)
{
if (datas == null || datas.Length == 0) return;
int colNum = datas.Length;
//oxa = new List<OpenXmlAttribute>();
// this is the row index
//oxa.Add(new OpenXmlAttribute("r", null, i.ToString()));
//oxw.WriteStartElement(new Row(), oxa);
oxw.WriteStartElement(new Row());
for (int j = 0; j < colNum; ++j)
{
var oxa = new List<OpenXmlAttribute>();
// this is the data type ("t"), with CellValues.String ("str")
oxa.Add(new OpenXmlAttribute("t", null, "str"));
// it's suggested you also have the cell reference, but
// you'll have to calculate the correct cell reference yourself.
// Here's an example:
//oxa.Add(new OpenXmlAttribute("r", null, "A1"));
//c.Append(f);
oxw.WriteStartElement(new Cell() { DataType = CellValues.InlineString }, oxa);
//oxw.WriteStartElement(new Cell());
oxw.WriteElement(new CellValue($"{datas[j]}"));
// this is for Cell
oxw.WriteEndElement();
}
// this is for Row
oxw.WriteEndElement();
}
/// <summary>
/// 写入表格数据
/// </summary>
/// <param name="datas"></param>
public void Write(List<object> datas)
{
if (datas == null || datas.Count == 0) return;
Write(datas.ToArray());
}
void Close()
{
// this is for SheetData
oxw.WriteEndElement();
// this is for Worksheet
oxw.WriteEndElement();
oxw.Close();
oxw = OpenXmlWriter.Create(xl.WorkbookPart);
oxw.WriteStartElement(new Workbook());
oxw.WriteStartElement(new Sheets());
// you can use object initialisers like this only when the properties
// are actual properties. SDK classes sometimes have property-like properties
// but are actually classes. For example, the Cell class has the CellValue
// "property" but is actually a child class internally.
// If the properties correspond to actual XML attributes, then you're fine.
oxw.WriteElement(new Sheet()
{
Name = sheetName,
SheetId = 1,
Id = xl.WorkbookPart.GetIdOfPart(wsp)
});
// this is for Sheets
oxw.WriteEndElement();
// this is for Workbook
oxw.WriteEndElement();
oxw.Close();
xl.Close();
}
#region IDisposable Support
private bool disposedValue = false; // 要检测冗余调用
protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: 释放托管状态(托管对象)。
Close();
}
// TODO: 释放未托管的资源(未托管的对象)并在以下内容中替代终结器。
// TODO: 将大型字段设置为 null。
disposedValue = true;
}
}
// TODO: 仅当以上 Dispose(bool disposing) 拥有用于释放未托管资源的代码时才替代终结器。
// ~OpenXmlExt() {
// // 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
// Dispose(false);
// }
// 添加此代码以正确实现可处置模式。
void IDisposable.Dispose()
{
// 请勿更改此代码。将清理代码放入以上 Dispose(bool disposing) 中。
Dispose(true);
// TODO: 如果在以上内容中替代了终结器,则取消注释以下行。
// GC.SuppressFinalize(this);
}
#endregion
}
使用:
object[] objTitle = new object[] { "SIM", "ICCID"};
string descFile="d:\\test.xlsx";
using (var oxExt = new ExcelUtil.ExcelExport(descFile, objTitle.Length, "清单"))
{
oxExt.Write(objTitle);
}
相关文章
- Newtonsoft.Json C# Json序列化和反序列化工具的使用、类型方法大全 C# 算法题系列(二) 各位相加、整数反转、回文数、罗马数字转整数 C# 算法题系列(一) 两数之和、无重复字符的最长子串 DateTime Tips c#发送邮件,可发送多个附件 MVC图片上传详解
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
- C#7.2——编写安全高效的C#代码 c# 中模拟一个模式匹配及匹配值抽取 走进 LINQ 的世界 移除Excel工作表密码保护小工具含C#源代码 腾讯QQ会员中心g_tk32算法【C#版】
- EF+LINQ事物处理 C# 使用NLog记录日志入门操作 ASP.NET MVC多语言 仿微软网站效果(转) 详解C#特性和反射(一) c# API接受图片文件以Base64格式上传图片 .NET读取json数据并绑定到对象
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
- wpf 导出Excel Wpf Button 样式 wpf简单进度条 List泛型集合对象排序 C#集合
- c#实例化继承类,必须对被继承类的程序集做引用 .net core Redis分布式缓存客户端实现逻辑分析及示例demo 数据库笔记之索引和事务 centos 7下安装python 3.6笔记 你大波哥~ C#开源框架(转载) JSON C# Class Generator ---由json字符串生成C#实体类的工具
- C#使用oledb连接excel运行Insert Into语句出现“操作必须使用一个可更新的查询”的解决的方法
- 【C#】获取汉字拼音首字母和全拼
- 在C#中GUID生成的四种格式
- c# Dictionary拓展2个key得到1个value
- C#,超级阿格里数字(超级丑数,Super Ugly Number)的算法与源代码
- [C#] 使用 Excel 和 Math.Net 进行曲线拟合和数据预测
- Excel VLOOKUP实用教程之 04 vlookup如何实现三变量查找,三个条件字段查询数据?(教程含数据excel)
- Excel VLOOKUP实用教程之 07 vlookup如何解决肉眼看完全匹配,但是就是返回N/A错误(教程含数据excel)
- C# NPOI 导入与导出Excel文档 兼容xlsx, xls
- C# 把DataGridView控件数据,转成DataTable
- 《C#零基础入门之百识百例》(五十七)密封类 -- 任意年月日历输出
- C# 装箱和拆箱
- C# 集合交、并、差、去重,对象集合交并差
- C#-Linq-使用Linq实现SQL的全连接
- C# default 关键字 (转)
- C# 导入Excel