c#用object将datatable快速填充excel后下载表格后打不开的问题
最近在用c#的asp.net,需要批量导出数据。原本用的是stringbuilder逐个填充,但是只能做到html强制格式转换为xls,这不是真正的excel表格,所以在网上找了datatable快速填充到excel的方法。
使用该方法后,发现下载了以后的表格没有办法用exce软件l打开,而且电脑的所有的excel文件都打不开了,重启后才可以,花了一天时间才找到问题所在。
如下图所示,打开表格,什么都不显示,表格名字也不对。

有的人遇到这种情况,可能是视图里面选择了隐藏,需要取消隐藏,但是我并没有隐藏数据,而且这几个按钮点击了就变暗,并没有反应

我觉得是我的代码有问题,就仔细检查了,最后终于发现问题所在了
以下是我的方法
protected void ExportExcel(System.Data.DataTable dt)
{
if (dt == null || dt.Rows.Count == ) return;
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
//Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.ApplicationClass();
if (xlApp == null)
{
return;
} System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");
Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;
Microsoft.Office.Interop.Excel.Workbook workbook =
workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);
Microsoft.Office.Interop.Excel.Worksheet worksheet =
(Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[];
Microsoft.Office.Interop.Excel.Range range, range2, range3, range4, range5, range6, range7;
long totalCount = dt.Rows.Count;
//long rowRead = 0;
//float percent = 0;
xlApp.ScreenUpdating = false; //屏幕不跟新,加快速度
int colCount = dt.Columns.Count;//列总数
int rowCount = dt.Rows.Count;//行总数
object[,] objData = new object[rowCount + , colCount];//标题
for (int i = ; i < dt.Columns.Count; i++)
{
worksheet.Cells[, i + ] = dt.Columns[i].ColumnName;
range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[, i + ];
range.Interior.ColorIndex = ;
range.Font.Bold = true;
}
//获取实际数据
for (int rowIndex = ; rowIndex < rowCount; rowIndex++)
{
for (int colIndex = ; colIndex < colCount; colIndex++)
{
objData[rowIndex, colIndex] = dt.Rows[rowIndex][colIndex].ToString();
}
}
for (int rowIndex = ; rowIndex < rowCount; rowIndex++)
{
objData2[rowIndex, ] = dt.Rows[rowIndex][].ToString();
objData3[rowIndex, ] = dt.Rows[rowIndex][].ToString();
objData4[rowIndex, ] = dt.Rows[rowIndex][].ToString();
objData5[rowIndex, ] = dt.Rows[rowIndex][].ToString();
objData6[rowIndex, ] = dt.Rows[rowIndex][].ToString();
}
range = (Range)worksheet.Range[xlApp.Cells[, ], xlApp.Cells[rowCount + , colCount]];
range.NumberFormatLocal = "@";//写入到表中的数据格式以文本形式存在
range.Value2 = objData; worksheet.Cells.Columns.AutoFit();
xlApp.Visible = true;
//11.保存表格到根目录下指定名称的文件中
string pathname = "~/Upload" + "/" + "Pks_data" + "/" + (string)Session[AppSetting.SESSION_USERNAME] +
DateTime.Now.Date.ToString("yyyyMMdd") + ".xlsx";
string filePath = Server.MapPath(pathname);//路径
if (System.IO.File.Exists(Path.GetFullPath(filePath)))
{
File.Delete(Path.GetFullPath(filePath));
}
xlApp.ActiveWorkbook.SaveAs(filePath);
xlApp.Quit();
xlApp = null;
GC.Collect();
DownloadFile(pathname);
} public void DownloadFile(string fileRpath)
{
string filepath = Server.MapPath(fileRpath);
Response.ClearHeaders();
Response.Clear();
Response.Expires = ;
Response.Buffer = true;
Response.AddHeader("Accept-Language", "zh-tw");
string name = System.IO.Path.GetFileName(filepath);
System.IO.FileStream files = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
byte[] byteFile = null;
if (files.Length == )
{
byteFile = new byte[];
}
else
{
byteFile = new byte[files.Length];
}
files.Read(byteFile, , (int)byteFile.Length);
files.Close(); Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(name, System.Text.Encoding.UTF8));
Response.ContentType = "application/octet-stream;charset=gbk";
Response.BinaryWrite(byteFile);
Response.Flush();
Response.End(); }
用了这个方法以后,的确比用stringbuilder快很多,而且可以导出正确格式的xlsx,但是打不开,后来发现问题出在这
//xlApp.ScreenUpdating = false; //屏幕不跟新,加快速度
把这一行注释了以后,就正常了,虽然我也不是很明白原理....
因为只会调用方法,但是不明白方法中每个语句的含义和用法,所以会有很多问题,希望自己能慢慢解决吧
2019-04-21
c#用object将datatable快速填充excel后下载表格后打不开的问题的更多相关文章
- DataTable数据导出Excel 并且下载
public string Excel(System.Data.DataTable dt) { //模板的路径 string strUploadPath = HttpContext.Current.S ...
- Excel中筛选两个表中相同的数据和快速填充一列的公式
将两个工作表放在一个文件中,使用if函数和countif函数判断 =if(判断条件countif(区域,条件),真值,[假值]) 实例 =if(countif(Sheet2!$A$1:$A$44,A2 ...
- Excel快速填充
利用单元格右下角填充句柄进行填充 然后选择快速填充 利用数据面板的快速填充功能(ctrl+e) 年月日三列不能同时填充 只能够一列一列的填充 类别取第一列 级别取第二列 但是由于第一个的编号有两个“1 ...
- Excel 快速填充功能介绍以及注意事项
快速填充 快速填充可以让我们以某种格式来填充单元格. 用"姓氏+职位"格式来快速地填充下面表格中第三列.在第一个单元格内输入"李书记",选中需要被填充的其他单元 ...
- [转].net 使用NPOI或MyXls把DataTable导出到Excel
本文转自:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.ht ...
- 带复杂表头合并单元格的HtmlTable转换成DataTable并导出Excel
步骤: 一.前台JS取HtmlTable数据,根据设定的分隔符把数据拼接起来 <!--导出Excel--> <script type="text/javascript&qu ...
- DataTable导出到Excel(.NET 4.0)
最近在论坛里又看到很多关于DataTable(DataSet)导入Excel的帖子,我也温故知新一下,用VS2010重新整理了一个Sample.这个问题简化一下就是内存数据到文件,也就是遍历赋值,只不 ...
- DataTable 导出到 Excel 类
底层类: #region DataTable 导出到 Excel /// <summary> /// DataTable 导出到 Excel /// </summary> // ...
- C# DataTable导出EXCEL后身份证、银行卡号等长数字信息显示乱码解决
在DataTable导出EXCEL后发现有些格式显示有问题,比如身份证.银行卡号等大于11位的数字显示为科学计数法.13681-1等 带中划线的两段数字显示为日期格式等. 处理方法如下: public ...
随机推荐
- .NET Core微服务 权限系统+工作流(二)工作流系统
一.前言 接上一篇 .NET Core微服务 权限系统+工作流(一)权限系统 ,再来一发 工作流,我在接触这块开发的时候一直好奇它的实现方式,翻看各种工作流引擎代码,探究其实现方式,个人总结出来一个核 ...
- Windows安全认证是如何进行的?[Kerberos篇]
最近一段时间都在折腾安全(Security)方面的东西,比如Windows认证.非对称加密.数字证书.数字签名.TLS/SSL.WS-Security等.如果时间允许,我很乐意写一系列的文章与广大网友 ...
- 数据库用户被锁怎么办,报the passord logon
–1.使用管理员用户登陆,查看用户状态: select username,account_status from dba_users; –2.修改用户状态: alter user base accou ...
- 使用原生javascript实现瀑布流
简介 瀑布流布局是一种很常见的布局方式,他的主要视觉体验为图片元素等宽不等高,图片元素之间的水平排序参差不齐,而且随着滚动条的滚动,数据会进行异步的加载,这样的布局有两个好处,1-有视觉的冲击力,比较 ...
- 七、SSR(服务端渲染)
使用框架的问题 下载Vue.js 执行Vue.js 生成HTML页面(首屏显示,依赖于vue.js的加载) 以前没有前端框架时,用jsp/php在服务器端进行数据的填充,发送给客户端就是已经填充好的数 ...
- weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
写在前面的话: weex官方文档不完善,在整个实施过程中遇到过很多坑,中途几次想放弃,总是有些不甘心.攻坚克难,总也是会有一些收获,先将收获进行分享也或是记录,防止忘记.要想用好weex必须对es5/ ...
- echarts的title和legend重合解决(各种小细节)
一:关于title与legend重叠 1.重合样子 2.解决办法: legend:{ show: true, top:"6%",//与上方的距离 可百分比% 可像素px }, 3. ...
- ConcurrentHashMap源码刨析(基于jdk1.7)
看源码前我们必须先知道一下ConcurrentHashMap的基本结构.ConcurrentHashMap是采用分段锁来进行并发控制的. 其中有一个内部类为Segment类用来表示锁.而Segment ...
- COGS 1944. 背驮式行走
★ 输入文件:piggyback.in 输出文件:piggyback.out 简单对比时间限制:1 s 内存限制:256 MB [题目描述] Bessie和她妹妹Elsie白天都在牧场 ...
- RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍
1. AMF AMF(是Action Message Format的缩写)是在flash和flex中与远程服务端交换数据的一种格式.它是二进制格式,Flash应用与服务端或数据库通过RPC交换数据时, ...