OpenXmlSdk导出Excel
感觉OpenXmlSdk的语法真的不是很友好。研究了半天,只实现了简单的导出功能。对于单元格样式的设置暂时还是搞明白,网上的资料真的很少,官方文档是英文的。中文的文章大都是用工具(Open XML SDK 2.0 Productivity Tool)搞出来的,反正在我这是不管用。最终还是回到了NPOI 的怀抱。
最后还是把这点代码记录一下,以后有时间再继续研究吧。
using System;
using System.Data;
using System.IO;
using System.Web;
using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet; public static class ExportHelper
{
/// <summary>
/// 导出Excel文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="dataSet">DataSet中每个DataTable生成一个Sheet</param>
public static void ExportExcel(string fileName, DataSet dataSet)
{
if (dataSet.Tables.Count == )
{
return;
} using (MemoryStream stream = DataTable2ExcelStream(dataSet))
{
FileStream fs = new FileStream(fileName, FileMode.CreateNew);
stream.WriteTo(fs);
fs.Flush();
fs.Close();
}
} public static void ExportExcel(string fileName, DataTable dataTable)
{
DataSet dataSet = new DataSet();
dataSet.Tables.Add(dataTable);
ExportExcel(fileName, dataSet);
} /// <summary>
/// Web导出Excel文件
/// </summary>
/// <param name="fileName"></param>
/// <param name="dataSet">DataSet中每个DataTable生成一个Sheet</param>
public static void ResponseExcel(string fileName, DataSet dataSet)
{
if (dataSet.Tables.Count == )
{
return;
} using (MemoryStream stream = DataTable2ExcelStream(dataSet))
{
ExportExcel(fileName, stream);
}
} public static void ResponseExcel(string fileName, DataTable dataTable)
{
DataSet dataSet = new DataSet();
dataSet.Tables.Add(dataTable.Copy());
ResponseExcel(fileName, dataSet);
} private static void ExportExcel(string fileName, MemoryStream stream)
{
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Charset = "UTF-8";
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.UTF8;
HttpContext.Current.Response.ContentType = "application/ms-excel";
HttpContext.Current.Response.BinaryWrite(stream.ToArray());
HttpContext.Current.Response.Flush();
HttpContext.Current.Response.End();
} private static MemoryStream DataTable2ExcelStream(DataSet dataSet)
{
MemoryStream stream = new MemoryStream();
SpreadsheetDocument document = SpreadsheetDocument.Create(stream,
SpreadsheetDocumentType.Workbook); WorkbookPart workbookPart = document.AddWorkbookPart();
workbookPart.Workbook = new Workbook(); Sheets sheets = document.WorkbookPart.Workbook.AppendChild(new Sheets()); for (int i = ; i < dataSet.Tables.Count; i++)
{
DataTable dataTable = dataSet.Tables[i];
WorksheetPart worksheetPart = document.WorkbookPart.AddNewPart<WorksheetPart>();
worksheetPart.Worksheet = new Worksheet(new SheetData()); Sheet sheet = new Sheet
{
Id = document.WorkbookPart.GetIdOfPart(worksheetPart),
SheetId = (UInt32)(i + ),
Name = dataTable.TableName
};
sheets.Append(sheet); SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>(); Row headerRow = CreateHeaderRow(dataTable.Columns);
sheetData.Append(headerRow); for (int j = ; j < dataTable.Rows.Count; j++)
{
sheetData.Append(CreateRow(dataTable.Rows[j], j + ));
}
} document.Close(); return stream;
} private static Row CreateHeaderRow(DataColumnCollection columns)
{
Row header = new Row();
for (int i = ; i < columns.Count; i++)
{
Cell cell = CreateCell(i + , , columns[i].ColumnName, CellValues.String);
header.Append(cell);
}
return header;
} private static Row CreateRow(DataRow dataRow, int rowIndex)
{
Row row = new Row();
for (int i = ; i < dataRow.Table.Columns.Count; i++)
{
Cell cell = CreateCell(i + , rowIndex, dataRow[i], GetType(dataRow.Table.Columns[i].DataType));
row.Append(cell);
}
return row;
} private static CellValues GetType(Type type)
{
if (type == typeof(decimal))
{
return CellValues.Number;
}
//if ((type == typeof(DateTime)))
//{
// return CellValues.Date;
//}
return CellValues.SharedString;
} private static Cell CreateCell(int columnIndex, int rowIndex, object cellValue, CellValues cellValues)
{
Cell cell = new Cell
{
CellReference = GetCellReference(columnIndex) + rowIndex,
CellValue = new CellValue { Text = cellValue.ToString() },
DataType = new EnumValue<CellValues>(cellValues),
StyleIndex =
};
return cell;
} private static string GetCellReference(int colIndex)
{
int dividend = colIndex;
string columnName = String.Empty; while (dividend > )
{
int modifier = (dividend - ) % ;
columnName = Convert.ToChar( + modifier) + columnName;
dividend = (dividend - modifier) / ;
} return columnName;
}
}
OpenXmlSdk导出Excel的更多相关文章
- .NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 导出Excel是.NET的常见需求,开源社区.市场上,都提供了不少各式各样的Excel操作相关包.本文,我将使用NPOI.EPPlus.OpenXML.Aspo ...
- [转帖].NET导出Excel的四种方法及评测
.NET导出Excel的四种方法及评测 https://www.cnblogs.com/sdflysha/p/20190824-dotnet-excel-compare.html 导出Excel是.N ...
- C#使用Aspose.Cells导出Excel简单实现
首先,需要添加引用Aspose.Cells.dll,官网下载地址:http://downloads.aspose.com/cells/net 将DataTable导出Xlsx格式的文件下载(网页输出) ...
- 利用poi导出Excel
import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.r ...
- [django]数据导出excel升级强化版(很强大!)
不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...
- NPOI导出Excel
using System;using System.Collections.Generic;using System.Linq;using System.Text;#region NPOIusing ...
- ASP.NET Core 导入导出Excel xlsx 文件
ASP.NET Core 使用EPPlus.Core导入导出Excel xlsx 文件,EPPlus.Core支持Excel 2007/2010 xlsx文件导入导出,可以运行在Windows, Li ...
- asp.net DataTable导出Excel 自定义列名
1.添加引用NPOI.dll 2.cs文件头部添加 using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System.IO; 3.代码如 ...
- Aspose.Cells导出Excel(1)
利用Aspose.Cells导出excel 注意的问题 1.DataTable的处理 2.进行编码,便于中文名文件下载 3.别忘了Aspose.Cells.dll(可以自己在网上搜索) public ...
随机推荐
- SOA和微服务
SOA和微服务 SOA和微服务到底是什么关系? 说实话,我确实不明白SOA和微服务到底有什么本质上的区别,两者说到底都是对外提供接口的一种架构设计方式.我倒觉得微服务其实就是随着互联网的发展,复杂的平 ...
- Scut AccountServer
开始以Scut搭建服务器框架: 1. 初始目录结构: libs 存放 scut 的引擎文件: release 存放 src 输出的文件: src 存放各子工程源文件: 2. Install.bat:目 ...
- 工作总结:将电脑中的ARP缓存清空黑屏命令
ARP -d 将电脑中的ARP缓存清空ARP-a 查看arp缓存arp-s ip与mac绑定
- hadoop 2.2.0 eclipse 插件编译 及相关eclipse配置图解
https://github.com/winghc/hadoop2x-eclipse-plugin 官网 http://kangfoo.github.io/article/2013/12/build- ...
- 开源java
http://code.google.com/p/nullpomino/source/checkout http://www.open-open.com/open254058.htm http://w ...
- Unity3d ngui基础教程
Unity3d ngui基础教程 NGUI教程:步骤1-Scene 1.创建一个新的场景(New Scene).2.选择并删除场景里的MainCamera.3.在NGUI菜单下选择Create a N ...
- 汇编cmp比较指令详解
刚刚看到了cmp指令,一开始有点晕.后来上网找了些资料,终于看明白了,为了方便初学者,我就简单写下我的思路吧.高手绕过,谢谢! cmp(compare)指令进行比较两个操作数的大小 例:cmp opr ...
- mt7601 driver
http://download.csdn.net/detail/u011500307/7011649 http://my.oschina.net/fgq611/blog/180750 http://b ...
- Linux日志文件系统(EXT4、XFS、JFS)及性能分析
Ext4 ReiserFS Btrfs 等七种文件系统性能比拼 自上一篇<Ext2 v.s. Ext3 v.s. Ext4 性能比拼> 发布以来,社会各界纷纷来电来函,给出了“Ext4 我 ...
- -_-#【Node】Express 400 Error: ENOENT, open
Express 400 Error: ENOENT, open cd alleatisland, node app来启动