DataTable数据导出到Excel,并发送到客户端进行下载
本代码实现思路是:页面显示和导出分开,导出的数据和用于页面显示的是同一查询数据方式,所以也是同样的数据,只是在导出数据时从数据库重新捞了一次数据。
此导出数据方式会先将数据保存到Excel中,然后将创建的Excel文件保存到服务器指定位置,然后下载到客户端,下载完后立即删除掉刚在服务器上创建的Excel文件。
// 导出按钮事件
protected void btOutputData_Click(object sender, EventArgs e)
{
ExportExcel(GetPrintingData(ViewState["ssearchCondition"].ToString()), Convert.ToInt32(ConfigurationManager.AppSettings["OutputData PageSize"].ToString()));
}
#region 导出数据
/// <summary>
/// 获取需要导出的数据
/// </summary>
/// <param name="strWhere">筛选数据的条件</param>
/// <returns></returns>
public System.Data.DataTable GetPrintingData(string strWhere)
{
System.Data.DataTable dt = GetListByPage(strWhere, , GetRecordCount(ViewState["ssearchCondition"].ToString()));
System.Data.DataTable newTable = new System.Data.DataTable();
newTable.Columns.AddRange(new DataColumn[]{
new DataColumn("rowN"),
new DataColumn("Description"),
new DataColumn("area"),
new DataColumn("projectName"),
new DataColumn("stake"), new DataColumn("itemProjectName"),
new DataColumn("newCol2"),
new DataColumn("newCol3"),
new DataColumn("newCol4"),
new DataColumn("newCol5"), new DataColumn("newCol6"),
new DataColumn("newCol7"),
new DataColumn("acceptConclution_zdb"),
new DataColumn("newCol8"),
new DataColumn("acceptConclution_zjb"), new DataColumn("joinAccept_yz"),
new DataColumn("joinAccept_zjb"),
new DataColumn("joinAccept_zdb"),
new DataColumn("joinAccept_xmb")});
int num = ;
for (int i = ; i < dt.Rows.Count; i++)
{
DataRow newRow = newTable.NewRow();
newRow["rowN"] = num++;// dt.Rows[i]["rowN"];
newRow["Description"] = dt.Rows[i]["Description"];
newRow["area"] = dt.Rows[i]["area"];
newRow["projectName"] = dt.Rows[i]["projectName"];
newRow["stake"] = dt.Rows[i]["stake"]; newRow["itemProjectName"] = dt.Rows[i]["itemProjectName"];
newRow["newCol2"] = dt.Rows[i]["newCol2"];
newRow["newCol3"] = dt.Rows[i]["newCol3"];
newRow["newCol4"] = dt.Rows[i]["newCol4"];
newRow["newCol5"] = dt.Rows[i]["newCol5"]; newRow["newCol6"] = dt.Rows[i]["newCol6"];
newRow["newCol7"] = dt.Rows[i]["newCol7"];
newRow["acceptConclution_zdb"] = dt.Rows[i]["acceptConclution_zdb"];
newRow["newCol8"] = dt.Rows[i]["newCol8"];
newRow["acceptConclution_zjb"] = dt.Rows[i]["acceptConclution_zjb"]; newRow["joinAccept_yz"] = dt.Rows[i]["joinAccept_yz"];
newRow["joinAccept_zjb"] = dt.Rows[i]["joinAccept_zjb"];
newRow["joinAccept_zdb"] = dt.Rows[i]["joinAccept_zdb"];
newRow["joinAccept_xmb"] = dt.Rows[i]["joinAccept_xmb"];
newTable.Rows.Add(newRow);
}
return newTable;
}
/// <summary>
/// 把table中的数据导出到excel中去
/// </summary>
/// <param name="dt">要导入的table</param>
/// <param name="maxcount">模板excel中,一个sheet要显示的行数,如果数据多一个sheet中的最大值,会自动生成新的sheet</param>
private void ExportExcel(System.Data.DataTable dt, int maxcount)
{
Random ran = new Random();
string fileautoname = Server.MapPath("~/") + DateTime.Now.ToString("yyyyMMddhhmmss") + ran.Next(, ) + ".xls";//给新文件命名
string filepath = Server.MapPath("/") + "UpLoadFile\\Template\\OutputDataBlock.xls"; //模板文件路径
object missing = Type.Missing;
Microsoft.Office.Interop.Excel.Application application = new Application();
Workbook workbook = application.Workbooks.Open(filepath, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
Worksheet worksheet;
worksheet = (Worksheet)workbook.Sheets.get_Item();
//DataView dv = dt.DefaultView;
//dv.Sort = "id asc"; //table 中的数据按id升序排列
//System.Data.DataTable table = dv.ToTable();
System.Data.DataTable table = dt;
int sheetcount = GetSheetCount(table.Rows.Count, maxcount);
for (int count = ; count < sheetcount; count++)
{
((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets.get_Item(count)).Copy(missing, workbook.Worksheets[count]);
}
List<object[,]> list = new List<object[,]>();
object[,] ret;
for (int count = ; count < sheetcount; count++)
{
if (count == sheetcount - )
{
ret = new object[table.Rows.Count - count * maxcount, table.Columns.Count - ];
for (int i = ; i < table.Rows.Count - count * maxcount; i++)
{
for (int j = ; j < table.Columns.Count - ; j++)
{
ret[i, j] = table.Rows[count * maxcount + i][j];
}
}
list.Add(ret);
}
else
{
ret = new object[maxcount, table.Columns.Count - ];
for (int i = ; i < maxcount; i++)
{
for (int j = ; j < table.Columns.Count - ; j++)
{
ret[i, j] = table.Rows[i + count * maxcount][j];
}
}
list.Add(ret);
}
} object[,] obj;
for (int p = ; p < list.Count; p++)
{
worksheet = (Worksheet)workbook.Sheets.get_Item(p + );
obj = list[p];
string cn = "L" + (obj.GetLength() + ).ToString(); //设置填充区域
worksheet.get_Range("A3", cn).FormulaR1C1 = obj;
}
workbook.SaveAs(fileautoname, missing, missing, missing, missing, missing, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing);
workbook.Close(missing, missing, missing);
application.Quit();
workbook = null; #region
System.IO.FileInfo file = new System.IO.FileInfo(fileautoname);
Response.Clear();
Response.Charset = "GB2312";
Response.ContentEncoding = System.Text.Encoding.UTF8;
// 添加头信息,为"文件下载/另存为"对话框指定默认文件名
Response.AddHeader("Content-Disposition", "attachment; filename=" + Server.UrlEncode(file.Name));
// 添加头信息,指定文件大小,让浏览器能够显示下载进度
Response.AddHeader("Content-Length", file.Length.ToString()); // 指定返回的是一个不能被客户端读取的流,必须被下载
Response.ContentType = "application/ms-excel"; // 把文件流发送到客户端
Response.WriteFile(file.FullName);
Response.Flush();//这个语句必须有,否则就不回弹出保存的对话框,搞了N久 //删除长生的临时Excel文件
string filePath = fileautoname;//获取文件路径
if (filePath != null && System.IO.File.Exists(filepath))
{
//判断文件是否存在,如果存在,就删除之
System.IO.File.Delete(filePath);
} // 停止页面的执行
Response.End();
#endregion
}
/// <summary>
/// 获取WorkSheet数量
/// </summary>
/// <param name="rowCount">记录总行数</param>
/// <param name="rows">每WorkSheet行数</param>
/// <returns></returns>
private int GetSheetCount(int rowCount, int rows)
{
int n = rowCount % rows; //余数 if (n == )
return rowCount / rows;
else
return Convert.ToInt32(rowCount / rows) + ;
} #endregion
DataTable数据导出到Excel,并发送到客户端进行下载的更多相关文章
- C#将DataTable数据导出到EXCEL的两种方法
1.在非服务器控件的页面导出数据,需要借助一张temp空页面post回后台的数据. 前台:window.location.href = "../Temp.aspx"; 后台: tr ...
- C# CLosedXML四句代码搞定DataTable数据导出到Excel
最近用到DataTable导出到Excel,网上看了一下,都不怎么好使,逛了下GitHub一下完美解决了 用到的.net库CLosedXML,这个库用于读取,处理和写入Excel 2007+(.xls ...
- 将IList、DataTable数据导出到Excel
/// <summary> /// IList导出Excel /// </summary> /// <typeparam name="T">&l ...
- C# 获取DataTable数据导出到Excel
protected void ExportExcel(System.Data.DataTable dt) { ) return; Microsoft.Office.Interop.Excel.Appl ...
- 利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的‘好’东西记 ...
- 在ASP.NET MVC中利用Aspose.cells 将查询出的数据导出为excel,并在浏览器中下载。
正题前的唠叨 本人是才出来工作不久的小白菜一颗,技术很一般,总是会有遇到一些很简单的问题却不知道怎么做,这些问题可能是之前解决过的.发现这个问题,想着提升一下自己的技术水平,将一些学的新的'好'东西记 ...
- C#大量数据导出到Excel(转)
工作过程中经常会用到将数据导出到Excel中,一般情况下需要导出的数据都是几百几千条或者上万条,这都没有什么问题,但有时候会遇到特殊的需求,客户要求把几十万条甚至上百万条的数据导出到Excel中,这就 ...
- Excel催化剂开源第15波-VSTO开发之DataTable数据导出至单元格区域
上篇提到如何从Excel界面上拿到用户的数据,另外反方向的怎样输出给用户数据,也是关键之处. VSTO最大的优势是,这双向的过程中,全程有用户的交互操作. 而一般IT型的程序,都是脱离用户的操作,只能 ...
- 将C1Chart数据导出到Excel
大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...
随机推荐
- MySQL 使用 比较函数 INTERVAL() 函数 实现数据按区间分组
首先看一下它的定义: INTERVAL(N,N1,N2,N3,..........) INTERVAL()函数进行比较列表(N1,N2,N3等等)中的N值.该函数如果N<N1返回0,如果N< ...
- unity, 由于project settings中time scale变成0导致动画不播放
在Mac和iOS间多次switch platform之后,忽然发现开始scene的动画不播了.进入游戏后再切回来动画恢复正常. 检查了scene的逻辑,发现没有任何问题.删除了Temp和Library ...
- 10710 - Chinese Shuffle(数论+完美洗牌)
UVA 10710 - Chinese Shuffle 题目链接 题意:给定n张牌,完美洗牌n - 1次,问是否会变回原来的序列 思路:完美洗牌: 如果有a1a2a3...anb1b2b3...bn的 ...
- Asp.net 数据库依赖那些事
声明:本文为作者原创文章,转载请注明出处 https://www.cnblogs.com/MaMaNongNong/p/8904022.html 问题背景: 最近做一个非常简单的功能,就是使用ajax ...
- HDU5374 Tetris (2015年多校比赛第7场)大模拟
思路: 先写好了几个函数.旋转,四种操作,推断能否够进行合并消除 题中有好几处要考虑的细节问题,如 自然下落究竟部时不进行合并的推断,而是当自然下落非法时才推断 假设消除一行,这一行上面的所以方块仅仅 ...
- C# 运行时中的泛型
将泛型类型或方法编译为 Microsoft 中间语言 (MSIL) 时,它包含将其标识为具有类型参数的元数据. 泛型类型的 MSIL 的使用因所提供的类型参数是值类型还是引用类型而不同. 第一次用值类 ...
- Linux学习之tune2fs
这是Linux系统用于文件系统自检的工具. 常用选项 -l 查看文件系统信息 -c max-mount-counts 设置强制自检的挂载次数,如果开启,每挂载一次mount conut就会加1,超过次 ...
- C 调用 lua 函数
C 调用 lua 函数 需要考虑的问题: 1. 使用 lua_pcall 可以调用 lua 函数,首先把 lua 函数入栈,然后把参数入栈, lua_pcall(luaState, 参数个数, 返回值 ...
- layui实现table表格的“关键字搜索”功能
$('#searchBtn').on('click',function(){ var type = $(this).data('type'); active[type] ? active[type]. ...
- collection动画
Collection View 动画 吴迪 12 May 2014 分享文章 UICollectionView 和相关类的设置非常灵活和强大.但是灵活性一旦增强,某种程度上也增加了其复杂性: UICo ...