关于ASP.NET 将数据导出成Excel 的总结[下]

简介:

使用ExcelHelper 封装类,将DataSet 输出成Excel文件的多个Sheet 页。

使用代码如下:

复制代码
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
btn.Click += new EventHandler(btn_Click);
Button1.Click += new EventHandler(Button1_Click);
}

void Button1_Click( object sender, EventArgs e)
{
var ds = new DataSet();
var dt = new DataTable( " TableName For Sheet1 ");
dt.Columns.Add( " col1 ");
dt.Columns.Add( " col2 ");
dt.Rows.Add( " Value1 ", " Value2 ");

var dt2 = new DataTable( " TableName For Sheet2 ");
dt2.Columns.Add( " col1 ");
dt2.Columns.Add( " col2 ");
dt2.Rows.Add( " Value1 ", " Value2 ");
ds.Tables.Add(dt);
ds.Tables.Add(dt2);
ExcelHelper.ToExcel(ds, " test.xls ", Page.Response);
}

void btn_Click( object sender, EventArgs e)
{
var ds = new DataSet();
DataTable dt = new DataTable();
dt.Columns.Add( " col ");
ds.Tables.Add(dt);
ExcelHelper.ToExcel(ds, " test.xls ", Page.Response);
}
}
复制代码


ExcelHelper.cs 封装类,源代码如下:
复制代码
// ExcelHelper.cs

public class ExcelHelper
{
// Row limits older Excel version per sheet
const int rowLimit = 65000;

private static string getWorkbookTemplate()
{
var sb = new StringBuilder();
sb.Append( " <xml version>\r\n<Workbook
xmlns=\ " urn:schemas-microsoft-com:office:spreadsheet\"\r\n ");
sb.Append( " xmlns:o=\"urn:schemas-microsoft-com:office:office\"\r\n
xmlns:x=\ " urn:schemas- microsoft-com:office:excel\"\r\n
xmlns:ss=\ " urn:schemas-microsoft-com:office:spreadsheet\">\r\n ");
sb.Append( " <Styles>\r\n
<Style ss:ID=\ " Default\" ss:Name=\"Normal\">\r\n
<Alignment ss:Vertical=\ " Bottom\"/>\r\n <Borders/> ");
sb.Append( " \r\n <Font/>\r\n <Interior/>\r\n <NumberFormat/>\r\n
<Protection/>\r\n </Style>\r\n
<Style ss:ID=\ " BoldColumn\">\r\n <Font ");
sb.Append( " x:Family=\"Swiss\" ss:Bold=\"1\"/>\r\n </Style>\r\n
<Style ss:ID=\ " s62\">\r\n <NumberFormat ");
sb.Append( " ss:Format=\"@\"/>\r\n </Style>\r\n
<Style ss:ID=\ " Decimal\">\r\n
<NumberFormat ss:Format=\ " 0.0000\"/>\r\n </Style>\r\n ");
sb.Append( " <Style ss:ID=\"Integer\">\r\n
<NumberFormat ss:Format=\ " 0\"/>\r\n </Style>\r\n
<Style ss:ID=\ " DateLiteral\">\r\n <NumberFormat ");
sb.Append( " ss:Format=\"mm/dd/yyyy;@\"/>\r\n </Style>\r\n
<Style ss:ID=\ " s28\">\r\n ");
sb.Append( " <Alignment ss:Horizontal=\"Left\" ss:Vertical=\"Top\"
ss:ReadingOrder=\ " LeftToRight\" ss:WrapText=\"1\"/>\r\n ");
sb.Append( " <Font x:CharSet=\"1\" ss:Size=\"9\"
ss:Color=\ " #808080\" ss:Underline=\"Single\"/>\r\n ");
sb.Append( " <Interior ss:Color=\"#FFFFFF\" ss:Pattern=\"Solid\"/>

</Style>\r\n</Styles>\r\n { 0}</Workbook> " );
return sb.ToString();
}

private static string replaceXmlChar( string input)
{
input = input.Replace( " & ", " & ");
input = input.Replace( " < ", " < ");
input = input.Replace( " > ", " > ");
input = input.Replace( " \" ", """ );
input = input.Replace( " ' ", " ' ");
return input;
}

private static string getWorksheets(DataSet source)
{
var sw = new StringWriter();
if (source == null || source.Tables.Count == 0)
{
sw.Write( " <Worksheet ss:Name=\"Sheet1\"><Table><Row>

<Cell ss:StyleID=\ " s62\"><Data ss:Type=\"String\"></Data>
</Cell></Row></Table></Worksheet> " );
return sw.ToString();
}
foreach (DataTable dt in source.Tables)
{
if (dt.Rows.Count == 0)
sw.Write( " <Worksheet ss:Name=\" " + replaceXmlChar(dt.TableName) +
" \"><Table><Row><Cell ss:StyleID=\"s62\">

<Data ss:Type=\ " String\"></Data></Cell></Row>
</Table></Worksheet> " );
else
{
// write each row data
var sheetCount = 0;
for ( int i = 0; i < dt.Rows.Count; i++)
{
if ((i % rowLimit) == 0)
{
// add close tags for previous sheet of the same data table
if ((i / rowLimit) > sheetCount)
{
sw.Write( " </Table></Worksheet> ");
sheetCount = (i / rowLimit);
}
sw.Write( " <Worksheet ss:Name=\" " +
replaceXmlChar(dt.TableName) +
(((i / rowLimit) == 0) ? "" :
Convert.ToString(i / rowLimit)) + " \"><Table> ");
// write column name row
sw.Write( " <Row> ");
foreach (DataColumn dc in dt.Columns)
sw.Write(
string.Format(
" <Cell ss:StyleID=\"BoldColumn\">

<Data ss:Type=\ " String\">{0}</Data></Cell> ",
replaceXmlChar(dc.ColumnName)));
sw.Write( " </Row>\r\n ");
}
sw.Write( " <Row>\r\n ");
foreach (DataColumn dc in dt.Columns)
sw.Write(
string.Format(
" <Cell ss:StyleID=\"s62\"><Data ss:Type=\"String\">

{ 0}</Data></Cell> " ,
replaceXmlChar
(dt.Rows[i][dc.ColumnName].ToString())));
sw.Write( " </Row>\r\n ");
}
sw.Write( " </Table></Worksheet> ");
}
}

return sw.ToString();
}
public static string GetExcelXml(DataTable dtInput, string filename)
{
var excelTemplate = getWorkbookTemplate();
var ds = new DataSet();
ds.Tables.Add(dtInput.Copy());
var worksheets = getWorksheets(ds);
var excelXml = string.Format(excelTemplate, worksheets);
return excelXml;
}

public static string GetExcelXml(DataSet dsInput, string filename)
{
var excelTemplate = getWorkbookTemplate();
var worksheets = getWorksheets(dsInput);
var excelXml = string.Format(excelTemplate, worksheets);
return excelXml;
}

public static void ToExcel
(DataSet dsInput, string filename, HttpResponse response)
{
var excelXml = GetExcelXml(dsInput, filename);
response.Clear();
response.AppendHeader( " Content-Type ", " application/vnd.ms-excel ");
response.AppendHeader
( " Content-disposition ", " attachment; filename= " + filename);
response.Write(excelXml);
response.Flush();
response.End();
}

public static void ToExcel
(DataTable dtInput, string filename, HttpResponse response)
{
var ds = new DataSet();
ds.Tables.Add(dtInput.Copy());
ToExcel(ds, filename, response);
}
}
复制代码
来源:http://www.codeproject.com/KB/office/ExportDataSetToExcel.aspx

Demo下载



本文转自钢钢博客园博客,原文链接:http://www.cnblogs.com/xugang/archive/2011/09/26/2191686.html,如需转载请自行联系原作者
作者: XuGang 网名:钢钢
出处: http://xugang.cnblogs.com

相关文章
|
1月前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
|
3月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
43 0
|
29天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
44 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
8天前
|
Java API Apache
|
11天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
23 4
|
15天前
|
JavaScript 前端开发 数据处理
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
|
2月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
1月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
1月前
|
前端开发 JavaScript
💥【exceljs】纯前端如何实现Excel导出下载和上传解析?
本文介绍了用于处理Excel文件的库——ExcelJS,相较于SheetJS,ExcelJS支持更高级的样式自定义且易于使用。表格对比显示,ExcelJS在样式设置、内存效率及流式操作方面更具优势。主要适用于Node.js环境,也支持浏览器端使用。文中详细展示了如何利用ExcelJS实现前端的Excel导出下载和上传解析功能,并提供了示例代码。此外,还提供了在线调试的仓库链接和运行命令,方便读者实践。
253 5
|
24天前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
110 0
下一篇
无影云桌面