当前位置:编程学习 > C#/ASP.NET >>

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

    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的方法呢?

  

--------------------编程问答-------------------- 我有导出2003的 ,没有问题哦。  你要嘛? --------------------编程问答--------------------
引用 1 楼 wang2129929 的回复:
我有导出2003的 ,没有问题哦。  你要嘛?


谢谢,暂不需要。 --------------------编程问答--------------------
引用楼主 flying86 的回复:
    ASP.NET 用 KinnSoft.Excel.OfficeOpenXml.dll将EXCEL2007 生成在服务器,接着写入Response后在客户端打开页面会出现如下错误:
EXCEL 在“XX.XLSX”中发现不可读内容。是否恢复此工作簿的内容?如果信任此工作簿的内容,请单“是”。

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

下载代码如下:
Response……


更改如下:如何导出EXCEL 2007格式的EXCEL文件,不需在服务器生成文件。谢谢 --------------------编程问答-------------------- http://blog.csdn.net/chen846262292/article/details/7348629
看能不能帮到你 --------------------编程问答-------------------- 这个是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();
            }
        }
    }
}
--------------------编程问答-------------------- 还需要一个名为“Aspose.Excel.dll”的文件自己网上找或者加我QQ:1977613110我传给你。 --------------------编程问答-------------------- 打开的时候好像是打开的副本,因为你的Excel被占用着
你是不是没有关闭打开的那个Excel程序? --------------------编程问答--------------------
引用 6 楼  的回复:
还需要一个名为“Aspose.Excel.dll”的文件自己网上找或者加我QQ:1977613110我传给你。


谢谢你的回答,这种方种有时候进程杀不掉。 --------------------编程问答--------------------
引用 7 楼  的回复:
打开的时候好像是打开的副本,因为你的Excel被占用着
你是不是没有关闭打开的那个Excel程序?


如何生成EXCEL 2007 格式的呢? --------------------编程问答-------------------- 最近在win server 2003上弄Word 2007,Excel 2007总是不能成功,太郁闷了。 --------------------编程问答-------------------- 最近也碰到GridView导出EXCEL问题。晚上大部分都是导出EXCEL2003但是那种方式在导出打开时会报一个错误。不知道现在导出EXCEL2007怎么搞~!~! --------------------编程问答-------------------- 我觉得想到处excel直接从dataset导出,不要依赖于控件,这样更方便
补充:.NET技术 ,  ASP.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,