Excelのエクスポートについても

29375 ワード

突っ込む
Excelは、中国のソフトウェア環境の下で、ソフトウェア開発の必須となるところだった.私はすべてのレポートがエクスポート機能を提供しないで、検収しないことに出会ったことがあります.レポートを见ることができて印刷することができてグラフを形成することができてすでに完璧で、本当にexcelをエクスポートするのが毛用があることが分かりませんが、会社は取引先の利益に頼って私达は会社に頼って给料を出して生活して、ああ!ツッコミを入れざるを得ない.ブログ園では、Excelが10 Wのデータをエクスポートして数秒以内に完成したという文章がありますが、見て驚いたことに、Excelは最大6 W以上のデータをサポートしています.強引に挿入するのはこんなに長いですが、Excelの女の子はどうやって耐えられますか.あなたはこんなに多くのデータを整理して、あなたはさっぱりしていますが、お客様がエクスポートしてから開けられません.白さんのお客様に会うと、パソコンを再起動しなければならないかもしれません.それから、あなたはさっぱりしません.私は后で5 W余りのデータ(20列)をエクスポートしてExcelを开いてゆっくりと死ぬことを试みて、しかも私のwps 2012个人版の神器は意外にも直接Game Overになりました.よし、いい加減にしないで、次はexcelが導出した3つの方法を整理して、ネットから来て、それから私の整理を加えて、後の2つはすでにプロジェクトの中で実際に運用しています.
方法1:
MicrosoftでOffice.Interop.Excelの作成方法をエクスポートし、excelの各セルに直接挿入します.ツッコミを入れるとカタツムリのように遅く、好きではないスキップができます.
プログラムの準備
1.プロジェクトにMicrosoftを追加する.Office.Interop.Excelの参照は、エクスポートするexcelスタイルのテンプレートを作成してプロジェクトのフォルダの下に置きます.2、この方法でエクスポートするにはMicrosoftを追加する必要があります.Office.Interop.Excelの引用、そしてサーバーの上でexcelをインストールする必要があって、サーバーの上でExcelバージョンをインストールすることを提案して少し低くて、2003は悪くありません.3、サーバー権限の設定、COM類工場のCLSIDが{00024500-00000-00000-C 00000-00000-00000-046}のようなコンポーネントの検索に失敗したエラーは、サーバー上のExcel権限が設定されていないことが多い.コントロールパネルを開きます=>管理ツール=>構築サービス=>構築サービス=>構築サービス=>コンピュータ=>マイコンピュータ=>DCOM構成=>Microsoft Excel.属性フラグを右クリックしてインタラクティブなユーザーを選択し、セキュリティラベルの起動とアクティブ化権限を選択してカスタマイズを選択し、編集ボタンをクリックしてASPを追加する.NET.
具体的な手順は以下の通りです.
生成方法
public void CreateExcel(System.Data.DataTable dt, string creatName, string MoName)
        {
            //  
            string inputFilePath = System.Web.HttpContext.Current.Server.MapPath(MoName);
            string outFilePath = System.Web.HttpContext.Current.Server.MapPath(creatName);
            //
            if (!File.Exists(outFilePath))
            {
                File.Copy(inputFilePath, outFilePath, true);
            }
            GC.Collect();
            ApplicationClass myApp = new ApplicationClass();
            Workbook myBook = null;
            Worksheet mySheet = null;
            myApp.Visible = false;
            object oMissiong = System.Reflection.Missing.Value;
            myApp.Workbooks.Open(outFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong
        , oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong); myBook
= myApp.Workbooks[1]; mySheet = (Worksheet)myBook.ActiveSheet; DataTableToExcel(dt, mySheet); myBook.Save(); myBook.Close(true, outFilePath, true); System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); GC.Collect(); }
public void DataTableToExcel(System.Data.DataTable dt, Worksheet excelSheet)
        {
            int rowCount = dt.Rows.Count;
            int colCount = dt.Columns.Count;
            for (int i = 0; i < rowCount; i++)
            {
                for (int j = 0; j < colCount; j++)
                {
                    mySheet.Cells[i + 1, j] = dt.Rows[i - 1][j - 1].ToString();
                }
            }
        }

呼び出し方法
CreateExcel ce = new CreateExcel();
            string MoName = "UserFiles/DataIn.xls";// 
            string creatName = "UserFiles\\" + " .xls" ;// excel 
            ce.Create(tbl, creatName, MoName);
            Response.Redirect(creatName);

方法2:
MicrosoftでOffice.Interop.Excel構築方式では、データは2次元配列方式で格納され、1つ目の方法とは数行のコードの違いしかないが、速度は数十倍速く、10 Wのデータは15秒程度(小白pc機)具体的なサーバ構成は方法のようなプログラムで次のように生成される.
public void Create(System.Data.DataTable dt, string creatName, string MoName)
        {
            //  
            string inputFilePath = System.Web.HttpContext.Current.Server.MapPath(MoName);
            string outFilePath = System.Web.HttpContext.Current.Server.MapPath(creatName);
            //
            if (!File.Exists(outFilePath))
            {
                File.Copy(inputFilePath, outFilePath, true);
            }
            GC.Collect();
            ApplicationClass myApp = new ApplicationClass();
            Workbook myBook = null;
            Worksheet mySheet = null;
            myApp.Visible = false;
            object oMissiong = System.Reflection.Missing.Value;
            myApp.Workbooks.Open(outFilePath, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong
        , oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong, oMissiong); myBook
= myApp.Workbooks[1]; mySheet = (Worksheet)myBook.ActiveSheet; DataTableToExcel(dt, mySheet); myBook.Save(); myBook.Close(true, outFilePath, true); System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet); System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(myApp); GC.Collect(); } public void DataTableToExcel(System.Data.DataTable dt, Worksheet excelSheet) { int rowCount = dt.Rows.Count; int colCount = dt.Columns.Count; object[,] dataArray = new object[rowCount + 1, colCount]; for (int i = 0; i < rowCount; i++) { for (int j = 0; j < colCount; j++) { dataArray[i, j] = dt.Rows[i][j]; } } // A2 excelSheet.get_Range("A2", excelSheet.Cells[rowCount + 1, colCount]).Value2 = dataArray; }

呼び出し方法
CreateExcel ce = new CreateExcel();
            string MoName = "UserFiles/DataIn.xls";// 
            string creatName = "UserFiles\\" + " .xls" ;// excel 
            ce.Create(tbl, creatName, MoName);
            Response.Redirect(creatName);

 
方法3:
この方法では、サーバにExcelをインストールする必要はなく、xmlを生成してクライアントにexcelで出力することで、クライアントにexcelをインストールする必要がある可能性がある(心細い)ので、めちゃくちゃな権限設定や、わけのわからないバージョンの問題もありません.さらに,この方法は第2の方法よりも10 W本のデータ(20列)を10秒未満(小白pc)試した.
方法は次のとおりです.
生成方法:
public static string CreateExcel(DataTable dt, List<string> columnNames)
    {
        StringBuilder strb = new StringBuilder();
        strb.Append(" <html xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
        strb.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
        strb.Append("xmlns=\"http://www.w3.org/TR/REC-html40\"");
        strb.Append(" <head> <meta http-equiv='Content-Type' content='text/html; charset=gb2312'>");
        strb.Append(" <style>");
        strb.Append(".xl26");
        strb.Append(" {mso-style-parent:style0;");
        strb.Append(" font-family:\"Times New Roman\", serif;");
        strb.Append(" mso-font-charset:0;");
        strb.Append(" mso-number-format:\"@\";}");
        strb.Append(" </style>");
        strb.Append(" <xml>");
        strb.Append(" <x:ExcelWorkbook>");
        strb.Append(" <x:ExcelWorksheets>");
        strb.Append(" <x:ExcelWorksheet>");
        strb.Append(" <x:Name>Sheet1 </x:Name>");
        strb.Append(" <x:WorksheetOptions>");
        strb.Append(" <x:DefaultRowHeight>285 </x:DefaultRowHeight>");
        strb.Append(" <x:Selected/>");
        strb.Append(" <x:Panes>");
        strb.Append(" <x:Pane>");
        strb.Append(" <x:Number>3 </x:Number>");
        strb.Append(" <x:ActiveCol>1 </x:ActiveCol>");
        strb.Append(" </x:Pane>");
        strb.Append(" </x:Panes>");
        //// 
        //strb.Append(" <x:ProtectContents>False </x:ProtectContents>");
        //strb.Append(" <x:ProtectObjects>False </x:ProtectObjects>");
        //strb.Append(" <x:ProtectScenarios>False </x:ProtectScenarios>");
        strb.Append(" </x:WorksheetOptions>");
        strb.Append(" </x:ExcelWorksheet>");
        strb.Append(" <x:WindowHeight>6750 </x:WindowHeight>");
        strb.Append(" <x:WindowWidth>10620 </x:WindowWidth>");
        strb.Append(" <x:WindowTopX>480 </x:WindowTopX>");
        strb.Append(" <x:WindowTopY>75 </x:WindowTopY>");
        strb.Append(" <x:ProtectStructure>False </x:ProtectStructure>");
        strb.Append(" <x:ProtectWindows>False </x:ProtectWindows>");
        strb.Append(" </x:ExcelWorkbook>");
        strb.Append(" </xml>");
        strb.Append("");
        strb.Append(" </head> <body> <table align=\"center\" style='border-collapse:collapse;table-layout:fixed'> <tr>");
        //if (ds.Tables.Count > 0)
        //{
        // 
        int columncount = columnNames.Count;
        for (int columi = 0; columi < columncount; columi++)
        {
            strb.Append(" <td> <b>" + columnNames[columi] + " </b> </td>");
        }
        strb.Append(" </tr>");
        // 
        for (int i = 0; i < dt.Rows.Count; i++)
        {
            strb.Append(" <tr>");
            for (int j = 0; j < dt.Columns.Count; j++)
            {
                strb.Append(" <td class='xl26'>" + dt.Rows[i][j].ToString() + " </td>");
            }
            strb.Append(" </tr>");
        }
        //}
        strb.Append(" </body> </html>");
        return strb.ToString();
        
    }

呼び出し方法:
protected void Button1_Click(object sender, EventArgs e)
    {
        string strSql = “select * from table1";
        System.Data.DataTable tbl = SqlHelper.GetDateTable(strSql);
        List<string> names = new List<string>() {
        " "," "," "," "," "," "," "," 1"," 2"," "," "," "," "," "

," "," "," "," "," "," " }; string str = ExcelHelper.CreateExcel(tbl, names); Response.Clear(); Response.Buffer = true; Response.Charset = "GB2312"; Response.AppendHeader("Content-Disposition", "attachment;filename=1213.xls"); Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");// Response.ContentType = "application/ms-excel";// excel 。 //this.EnableViewState = false; Response.Write(str); Response.End(); }