开发环境:C# + EXCEL2003 + VS2008

问题:

当使用如下代码从gridview导出数据到excel后,无法从excel取出数据,具体如下:

1、原使用的代码:

        protected void ExcelOut_Click(object sender, EventArgs e){Response.Clear(); //清除缓冲区流中的所有内容输出Response.Buffer = true; //Response.Charset = "";    //设置输出流的http字符集//保存附件用"attachment;filename=bang.xls";在线打开用"online;filename=bang.xls"//可以是.doc、.xls、.txt、.htm、Response.AppendHeader("Content-Disposition", "attachment;filename=bang.xls");Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//设置输出流为简体中文//设置输出文件类型为excel文件。保存为word时,应为"application/ms-word" //可以为application/ms-excel、application/ms-word、application/ms-txt、application/ms-html、或其他浏览器可直接支持文档  Response.ContentType = "application/vnd.ms-excel";this.EnableViewState = false;   //关闭保存视图状态 System.Globalization.CultureInfo myCItrad = new System.Globalization.CultureInfo("ZH-CN", true);//区域设置System.IO.StringWriter oStringWriter = new System.IO.StringWriter(myCItrad);System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);DepartList.RenderControl(oHtmlTextWriter); //将DataGrid(dgBang)中的内容输出到oHtmlTextWriterResponse.Write(oStringWriter.ToString());Response.End();//将当前所有缓冲的输出发送到客户端,并停止该页执行}

使用这段代码确实可以导出数据,并以excel的格式保存在用户的客户端电脑里,但当使用到这些导出的excel文件时就出问题了,下面代码是使用这些excel文件的:

前台页面需要一个控件配合:

<asp:FileUpload ID="ExcelIn" runat="server" Width="250px" CssClass="inputcss" Height="16px" ></asp:FileUpload>  <font face="宋体"></font>

        protected void ExcelInButton_Click(object sender, EventArgs e){string strFilePath = "";string serverPath = "";//通过控件来获取用户待上传的excel文件名,这个excel文件其实是上面程序产生的文件strFilePath = ExcelIn.PostedFile.FileName;// strFilePath = strFilePath.Substring(strFilePath.LastIndexOf("."));// 获取系统时间生成附件名//strFilePath = DateTime.Now.ToFileTime().ToString() + strFilePath;// 将附件保存到服务器上ExcelIn.PostedFile.SaveAs(("D:") + "\\空调标杆附件\\" + strFilePath);serverPath = "D:\\空调标杆附件\\" + strFilePath;string strCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + serverPath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";OleDbConnection ExcelConn = new OleDbConnection(strCon);try{string strCom = "SELECT * FROM [Sheet1$]";<span style="background-color: rgb(255, 102, 102);">ExcelConn.Open();</span>OleDbDataAdapter myCommand = new OleDbDataAdapter(strCom, ExcelConn);DataSet ds = new DataSet();myCommand.Fill(ds, "[Sheet1$]");<pre>                //由于excel列名“当月效益”和gridview中“当月效益”指定的数据源"效益"不一样,无法匹配数据源,因此要把excel中列名改为“效益”ds.Tables[0].Columns["当月效益"].ColumnName = "效益";DepartList.DataSource = ds;DepartList.DataBind();ExcelConn.Close();}catch (MembershipCreateUserException ex){ExcelConn.Close();Response.Write("<script>alert('导入内容:" + ex.Message + "')</script>");}}

当程序运行到下面程序时,会报错,错误代码为:"外部表不是预期的格式错误"。

ExcelConn.Open();

分析:

当我们用2003以上版本的excel打开这些excel文件时,会出现:文件格式和扩展名不匹配,文件可能已损坏或不安全。

这说明我们用

 ExcelOut_Click(object sender, EventArgs e)

来生成excel文件的方法不是很好,我在网上查阅了大量资料,按照各种方法也没有解决这个问题,然后我用另外一种方法从gridview导出数据到excel,结果成功了,不再出现:“文件格式和扩展名不匹配,文件可能已损坏或不安全”这个错误。代码如下:

       /// <summary>/// 将数据从gridview导入到本地excel,文件保存在D:\\调试文件\\中,文件名为当时的时间/// </summary>/// <param name="FileName"></param>private void SaveFile(String FileName){try{string fileNameString = "D:\\调试文件\\" + FileName;//验证strFileName是否为空或值无效   if (fileNameString.Trim() == " "){ return; }//定义表格内数据的行数和列数   int rowscount = DepartList.Rows.Count;int colscount = DepartList.Columns.Count;//行数必须大于0   if (rowscount <= 0){System.Web.HttpContext.Current.Response.Write("没有数据可供保存");return;}//列数必须大于0   if (colscount <= 0){System.Web.HttpContext.Current.Response.Write("没有数据可供保存");return;}//行数不可以大于65536   if (rowscount > 65536){System.Web.HttpContext.Current.Response.Write("数据记录数太多(最多不能超过65536条)");return;}//列数不可以大于255   if (colscount > 255){System.Web.HttpContext.Current.Response.Write("数据记录行数太多,不能保存");return;}Microsoft.Office.Interop.Excel.Application objExcel = null;Microsoft.Office.Interop.Excel.Workbook objWorkbook = null;Microsoft.Office.Interop.Excel.Worksheet objsheet = null;try{//申明对象   objExcel = new Microsoft.Office.Interop.Excel.Application();objWorkbook = objExcel.Workbooks.Add(true);objsheet = (Microsoft.Office.Interop.Excel.Worksheet)objWorkbook.ActiveSheet;//设置EXCEL不可见   objExcel.Visible = false;//设置列宽//objExcel.Range objRng = objsheet.get_Range(objsheet.Cells[1, 1], objsheet.Cells[1, 1]);//向Excel中写入表格的表头   int displayColumnsCount = 1;for (int i = 0; i <= DepartList.Columns.Count - 1; i++){if (DepartList.Columns[i].Visible == true){objExcel.Cells[1, displayColumnsCount] = DepartList.Columns[i].HeaderText.Trim();displayColumnsCount++;}}//向Excel中逐行逐列写入表格中的数据   for (int row = 0; row <= DepartList.Rows.Count - 1; row++){displayColumnsCount = 1;for (int col = 0; col < 2; col++){if (DepartList.Columns[col].Visible == true){try{if (DepartList.Rows[row].Cells[col].Text != null){objExcel.Cells[row + 2, displayColumnsCount] = DepartList.Rows[row].Cells[col].Text.ToString();}else{objExcel.Cells[row + 2, displayColumnsCount] = "";}displayColumnsCount++;}catch (Exception ex){System.Web.HttpContext.Current.Response.Write(ex.Message);}}}}//保存文件   objWorkbook.SaveAs(fileNameString, true, null, null, null,null, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, true, true, true,true, true);objExcel.Quit();}catch (Exception error){System.Web.HttpContext.Current.Response.Write(error.Message);return;}}catch (Exception ex){System.Web.HttpContext.Current.Response.Write(ex.Message);}}

上面的函数只能实现从gridview导出数据到excel,要使得用户可以下载生成的文件,那得用到另一个函数:

        /// 下载服务器上已有文件/// </summary>/// <param name="fileName">保存到客户端时的文件名</param>/// <param name="filePath">下载文件在服务器上所在物理路径全名</param>public static void DownloadFile(String fileName, String filePath){FileInfo fileInfo = new FileInfo(filePath);System.Web.HttpContext.Current.Response.Clear();System.Web.HttpContext.Current.Response.ClearContent();System.Web.HttpContext.Current.Response.ClearHeaders();System.Web.HttpContext.Current.Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);System.Web.HttpContext.Current.Response.AddHeader("Content-Length", fileInfo.Length.ToString());System.Web.HttpContext.Current.Response.AddHeader("Content-Transfer-Encoding", "binary");System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";System.Web.HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");System.Web.HttpContext.Current.Response.WriteFile(fileInfo.FullName);System.Web.HttpContext.Current.Response.Flush();System.Web.HttpContext.Current.Response.End();}

使用方法如下:

       protected void ExcelOut_Click(object sender, EventArgs e){string FileName = DateTime.Now.ToFileTime().ToString() + ".xls";string FilePath = "D:\\调试文件\\" + FileName;SaveFile(FileName);DownloadFile(FileName, FilePath);}

导入EXCEL报错:外部表不是预期的格式错误、文件格式和扩展名不匹配,文件可能已损坏或不安全的解决方法相关推荐

  1. C# 导入EXCEL 报错外部表不是预期的格式错误

    错误经过:在读取Excel时,出现外部表不是预期的格式 错误原因1: 由于 Excel 97-2003的连接格式与 Excel 2010 的 不同造成. 以下是从网上摘抄原文 Excel " ...

  2. 导入EXCEL2007报错外部表不是预期的格式错误

    错误经过:在读取Excel时,出现外部表不是预期的格式 错误原因1: 由于 Excel 97-2003的连接格式与 Excel 2007 的 不同造成. 以下是从网上摘抄原文 Excel " ...

  3. Excel导入数据库出现“外部表不是预期的格式”错误的解决方法

    Excel导入数据库出现"外部表不是预期的格式"错误的解决方法 参考文章: (1)Excel导入数据库出现"外部表不是预期的格式"错误的解决方法 (2)http ...

  4. 导入Excle数据至数据库 “外部表不是预期的格式”错误信息

    在操作excel将数据从外部导入到数据库时, 刚开始操作的没有问题的,却报出了:"外部表不是预期的格式"错误信息. 仔细查看excel没有问题, 查阅资料,发现有人说: 解决方法: ...

  5. 对于连接Excel时“外部表不是预期的格式”错误的处理

    对于由File.Create(fileName)创建的Excel文件,虽然格式是Excel文件,但是并不是标准的Excel文件,用Ado.net对这种文件连接操作时,会提示"外部表不是预期的 ...

  6. 外部表不是预期的格式错误

    本地测试出错原因:web.config里链接的是Access2003的驱动,而我本机充当服务器,安装的Access2007,所以导出时会出现这个问题:"外部表不是预期的格式错误". ...

  7. sql server 2008:导入excel,出现“外部表不是预期格式“错误

    原因:猜测是因为某些系统导出的excel表自带某些格式(我出现问题的是海信商业系统导出的数据). 解决方法:简单粗暴,将表格另存为excel97-2003版本后,再导入,问题解决.

  8. 关于Excel“文件格式和扩展名不匹配。文件可能已损坏或不安全”的解决方法

    win键+R键,打开"运行",输入regedit打开"注册表编辑器" 找到HKEY_CURRENT_USER\SOFTWARE\Microsoft\Office ...

  9. Excel加载项出错,显示【ExcelAPInet-Addln.xll的文件格式和扩展名不匹配】我知道的解决方案

    我遇到这个问题是出现在安装了Excel翻译公式,WPS翻译公式,批量翻译公式,Excel快递查询公式,WPS快递查询公式,17Track查询公式 - 辉耀Excel网络函数库提供的免费版本的Excel ...

最新文章

  1. Linux那些事儿 之 戏说USB(24)设备的生命线(七)
  2. python 递归 分叉_浅谈Python 递归算法指归
  3. 转:让 ThinkPad 的中键加小红帽模拟鼠标滚轮
  4. java 整数加减_Java计算长整数加减(字符串表示)
  5. iOS应用签名原理--数字签名?代码签名?双层代码签名?
  6. php导出excel失败原因,PHPExcel导出Excel文件报找不到该文件错误
  7. vs 中使用32 位mysql_vs2010连接mysql数据库(含win32和x64两种平台)
  8. 设置hash后导致的返回问题的解决方案
  9. Mysql中循环拼接参数_利用循环向数据库中插入数据,参数重复的问题
  10. 身份证识别+银行卡识别:开启移动互金新体验
  11. C语言--第一周作业(更改)
  12. ios怎么更新测试软件,苹果iOS13 beta3测试版升级教程 iOS13 beta3更新方法
  13. JavaScript:实现返回格式化的电话号码的字符串算法(附完整源码)
  14. intuitionistic fuzzy set 运算规则python实现
  15. 设计必备,5个免费图标资源网站
  16. JS(JavaScript)验证身份证号码格式的合法性
  17. 例说BPEL4WS(5)---伙伴与伙伴连接
  18. Android:滤镜效果ColorMatrix用法一
  19. 示波器常用的13个概念
  20. 让你的linux fedora 超过mac帅

热门文章

  1. Wormhole for mac(在Mac上控制iOS和Android设备)
  2. 网页文档下载不了怎么办 亲测可用!建议收藏!
  3. 想学好前端 H5 CSS3 的小朋友们康康我~
  4. LoadRunner9.1下载与破解
  5. 最简单的 DRM 应用 drm设备不工作
  6. 拿到20W年薪offer的面试总结
  7. 1+1为什么等于2(哥德巴赫猜想)
  8. 如何用lisp画蔓叶线_用Autolisp 在AutoCAD中实现多种曲线的绘制
  9. 第三章 项目立项管理
  10. wpdec函数_MATLAB小波函数总结