ASP.NET导出EXCEL2007 打开时会出现如下信息

梦在溪田 2012-03-15 10:36:12
ASP.NET 用 KinnSoft.Excel.OfficeOpenXml.dll将EXCEL2007 生成在服务器,接着写入Response后在客户端打开页面会出现如下错误:
EXCEL 在“XX.XLSX”中发现不可读内容。是否恢复此工作簿的内容?如果信任此工作簿的内容,请单“是”。

在服务器生成的EXCEL打开是不会出现这个错误的。

下载代码如下:
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName); //设置回发内容为Excel
Response.ContentType = "application/ms-excel"; //application/octet-stream
Response.WriteFile(path + fileName);


顺便带句:有没更好的导出EXCEL2007的方法呢?



...全文
458 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fjsnail 2012-08-08
  • 打赏
  • 举报
回复
我觉得想到处excel直接从dataset导出,不要依赖于控件,这样更方便
wangjue882 2012-08-08
  • 打赏
  • 举报
回复
最近也碰到GridView导出EXCEL问题。晚上大部分都是导出EXCEL2003但是那种方式在导出打开时会报一个错误。不知道现在导出EXCEL2007怎么搞~!~!
肖义崇 2012-04-25
  • 打赏
  • 举报
回复
最近在win server 2003上弄Word 2007,Excel 2007总是不能成功,太郁闷了。
梦在溪田 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

打开的时候好像是打开的副本,因为你的Excel被占用着
你是不是没有关闭打开的那个Excel程序?
[/Quote]

如何生成EXCEL 2007 格式的呢?
梦在溪田 2012-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

还需要一个名为“Aspose.Excel.dll”的文件自己网上找或者加我QQ:1977613110我传给你。
[/Quote]

谢谢你的回答,这种方种有时候进程杀不掉。
叫我 Teacher 周 2012-03-16
  • 打赏
  • 举报
回复
打开的时候好像是打开的副本,因为你的Excel被占用着
你是不是没有关闭打开的那个Excel程序?
WX53492379 2012-03-16
  • 打赏
  • 举报
回复
还需要一个名为“Aspose.Excel.dll”的文件自己网上找或者加我QQ:1977613110我传给你。
WX53492379 2012-03-16
  • 打赏
  • 举报
回复
这个是Excel的帮助类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data.Odbc;
using System.Data;
using System.Diagnostics; // 命名空间提供特定的类,使您能够与系统进程、事件日志和性能计数器进行交互
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Excel;

namespace MyExcelWeb.ExcelUtility
{
/// <summary>
/// Excel数据操作类
/// </summary>
public class ExcelHelper
{
/// <summary>
/// 导入CVS文件格式
/// </summary>
/// <param name="fileName"></param>
/// <param name="path"></param>
/// <returns></returns>
public static DataSet ConnectCSVFile(string fileName, string path)
{
string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=";
strConn += path;
strConn += ";Extensions=asc,csv,tab,txt;HDR=Yes;Persist Security Info=False";
OdbcConnection objConn = new OdbcConnection(strConn);
DataSet ds = new DataSet();
try
{
string strSql = "select * from " + fileName; //fileName, For example: 1.csv
OdbcDataAdapter odbcCSVDataAdapter = new OdbcDataAdapter(strSql, objConn);
odbcCSVDataAdapter.Fill(ds);
}
catch (Exception ex)
{
throw ex;
}
finally
{
System.GC.Collect();
}

return ds;
}

/// <summary>
/// 导入Excel文件
/// </summary>
/// <param name="filepath"></param>
/// <param name="ExcelName"></param>
/// <returns></returns>
/// IMEX=1将强制混合数据转换为文本,HDR=NO将第一行作为内容,由于第一行Header都是文本,因此所有列的类型都将转换成文本。

public static DataSet ExcelToDataTable(string filepath, string ExcelName)
{
string strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties='Excel 8.0;IMEX=1;HDR=YES'";
System.Data.OleDb.OleDbConnection Conn = new System.Data.OleDb.OleDbConnection(strCon);
string strCom = "SELECT * FROM " + "[" + ExcelName + "$]";//读取Excel文件内容
Conn.Open();
System.Data.OleDb.OleDbDataAdapter myCommand = new System.Data.OleDb.OleDbDataAdapter(strCom, Conn);
DataSet ds = new DataSet();
myCommand.Fill(ds, ExcelName);
Conn.Close();
return ds;

}

/// <summary>
/// 导出Excel文件
/// </summary>
/// <param name="tmpDataTable"></param>
/// <param name="strFileName"></param>
public static void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
{
//检查进程
List<Process> excelProcesses = GetExcelProcesses();
if (excelProcesses.Count > 0)
{
KillTheExcel();//杀死进程
}

Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
try
{
if (tmpDataTable == null)
return;
int rowNum = tmpDataTable.Rows.Count;
int columnNum = tmpDataTable.Columns.Count;
int rowIndex = 1;//如果需要导出列名,设置为1,否则设置为0
int columnIndex = 0;

xlApp.DefaultFilePath = "";
xlApp.DisplayAlerts = true;
xlApp.SheetsInNewWorkbook = 1;

Excel.Worksheet ExcelSheet = (Worksheet)xlBook.Worksheets[1];

//将DataTable的列名导入Excel表第一行(如果需要可以加上)
foreach (DataColumn dc in tmpDataTable.Columns)
{
columnIndex++;
xlApp.Cells[rowIndex, columnIndex] = dc.ColumnName;
}


//将DataTable中的数据导入Excel中
for (int i = 0; i < rowNum; i++)
{
rowIndex++;
columnIndex = 0;
for (int j = 0; j < columnNum; j++)
{
columnIndex++;
xlApp.Cells[rowIndex, columnIndex] = tmpDataTable.Rows[i][j].ToString();
}
}

}
catch (Exception ex)
{

throw ex;
}
finally
{
xlApp.Workbooks.Close();
xlApp.Quit();//关闭进程,自动保存
System.GC.Collect();

}
}

/// <summary>
/// 获得进程
/// </summary>
/// <returns></returns>
private static List<Process> GetExcelProcesses()
{
Process[] processes = Process.GetProcesses();
List<Process> ListProcess = new List<Process>();

foreach (Process _pr in processes)
{
if (_pr.ProcessName.ToUpper().Equals("EXCEL"))
{
ListProcess.Add(_pr);
}
}
return ListProcess;
}

/// <summary>
/// 销毁所有Excel进程
/// </summary>
public static void KillTheExcel()
{
List<Process> listProcess = GetExcelProcesses();
foreach (Process _pr in listProcess)
{
_pr.Kill();
}
}
}
}
  • 打赏
  • 举报
回复
我有导出2003的 ,没有问题哦。 你要嘛?
quifar123 2012-03-15
  • 打赏
  • 举报
回复
梦在溪田 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用楼主 flying86 的回复:]
ASP.NET 用 KinnSoft.Excel.OfficeOpenXml.dll将EXCEL2007 生成在服务器,接着写入Response后在客户端打开页面会出现如下错误:
EXCEL 在“XX.XLSX”中发现不可读内容。是否恢复此工作簿的内容?如果信任此工作簿的内容,请单“是”。

在服务器生成的EXCEL打开是不会出现这个错误的。

下载代码如下:
Response……
[/Quote]

更改如下:如何导出EXCEL 2007格式的EXCEL文件,不需在服务器生成文件。谢谢
梦在溪田 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 wang2129929 的回复:]

我有导出2003的 ,没有问题哦。 你要嘛?
[/Quote]

谢谢,暂不需要。

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧