1. 程式人生 > >C# 匯出Excel 多個Sheet 和 單個Sheet

C# 匯出Excel 多個Sheet 和 單個Sheet

在工作中,會遇到這樣的需求,選取某一年,匯出選擇年份的月度、季度或者年度報表,月度報表不可能產生12個單獨的Excel,這樣的話客戶可能會和你拼命,將12個月份分為12個Sheet放在一個Excel裡面,可能客戶會請你吃飯。

目前的做法是根據選擇的年份,將該年份所有的資料全部獲取到,根據表的型別(幾個Sheet)分為多個DataTable放到DataSet裡面,接著根據DataSet.Tables的數量匯出相應數量Sheet的Excel。

步驟一:查詢資料(程式碼略)

步驟二:分解DataTable(程式碼段一)

步驟三:匯出Excel(程式碼段二)

附:單Sheet匯出Excel(程式碼段三)

程式碼段一:

        /// <summary>
        /// 將DataTable裡面的資料按 type 規則分為一定數量的DataTable 放到DataSet裡
        /// </summary>
        /// <param name="ds">目標儲存</param>
        /// <param name="dt">源資料</param>
        /// <param name="type">規則型別</param>
        private void Classification(DataSet ds,DataTable dt, string type)
        {
            if (type == "月度報表")
            {
                for (int i = 0; i < 12; i++)
                {
                    DataTable table = new DataTable();
                    table = dt.Clone();
                    table.TableName = "dt" + i;
                    ds.Tables.Add(table);
                }
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    for (int j = 0; j < 12; j++)
                    {
                        if ((int)dt.Rows[i]["TB_I_Month"] == j + 1)
                        {
                            ds.Tables[j].Rows.Add(dt.Rows[i].ItemArray);
                            continue;
                        }
                    }
                }
                for (int i = 0; i < 12; i++)
                {
                    ds.Tables[i].Columns.Remove(ds.Tables[i].Columns["TB_I_Month"]);
                }
            }
            if (type == "季度報表")
            {
                for (int i = 0; i < 4; i++)
                {
                    DataTable table = new DataTable();
                    table = dt.Clone();
                    table.TableName = "dt" + i;
                    ds.Tables.Add(table);
                }

                int index = 0;
                for (int j = 0; j < 12; j += 3)
                {
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                        if ((int)dt.Rows[i]["TB_I_Month"] == j + 1 || (int)dt.Rows[i]    ["TB_I_Month"] == j + 2 || (int)dt.Rows[i]["TB_I_Month"] == j + 3)
                        {
                            ds.Tables[index].Rows.Add(dt.Rows[i].ItemArray);
                        }
                    }
                    index++;
                }
                for (int i = 0; i < 4; i++)
                {
                    ds.Tables[i].Columns.Remove(ds.Tables[i].Columns["TB_I_Month"]);
                }
            }
            if (type == "年度報表")
            {
                DataTable table = new DataTable();
                table = dt.Clone();
                table.TableName = "dt";
                ds.Tables.Add(table);
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    ds.Tables[0].Rows.Add(dt.Rows[i].ItemArray);
                }
                ds.Tables[0].Columns.Remove(ds.Tables[0].Columns["TB_I_Month"]);
            }
        }

 程式碼段二:

        /// <summary>
        /// 匯出多 Sheet 報表
        /// </summary>
        /// <param name="ds">要匯出的資料</param>
        public void DataToExcle(System.Data.DataSet ds)
        {
            if (ds.Tables == null||ds.Tables.Count==0)
            {
                MessageBox.Show("無資料!");
                return;
            }
            SaveFileDialog saveFileDialog = new SaveFileDialog();
            saveFileDialog.DefaultExt = "xlsx";
            saveFileDialog.Title = "匯出資料到Execl表格";
            if (ds.Tables.Count == 12)
                saveFileDialog.FileName = "月度報表";
            if (ds.Tables.Count == 4)
                saveFileDialog.FileName = "季度報表";
            if (ds.Tables.Count == 1)
                saveFileDialog.FileName = "年度報表";
            saveFileDialog.Filter = "microsoft office execl files (*.xlsx)|*.xlsx";
            saveFileDialog.RestoreDirectory = true;

            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                System.Reflection.Missing miss = System.Reflection.Missing.Value;
                Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();
                xlapp.Visible = true;
                Workbooks workbooks = xlapp.Workbooks;
                Workbook workbook = workbooks.Add(true);
                if (ds.Tables.Count > 1)
                {
                    workbook.Sheets.Add(miss,workbook.Sheets[1], ds.Tables.Count - 1, miss);
                }
                
                for (int d = 0; d < ds.Tables.Count; d++)
                {
                    Worksheet ws = workbook.Worksheets[d + 1] as Worksheet;
                    if (ds.Tables.Count == 12)
                        ws.Name = d + 1 + "月份";
                    if (ds.Tables.Count == 4)
                        ws.Name = d + 1 + "季度";
                    if (ds.Tables.Count == 1)
                        ws.Name = "年度";
                    int totalCellsCount = ds.Tables[d].Columns.Count;
                    Range range = ws.Range[ws.Cells[1, 1], ws.Cells[1, ds.Tables[d].Columns.Count]];
                    //生成列
                    for (int i = 0; i < ds.Tables[d].Columns.Count; i++)
                    {
                        range.Cells[1, i + 1] = ds.Tables[d].Columns[i].ColumnName;
                        range.Interior.ColorIndex = 15;
                        range.Font.Bold = true;
                        range.Font.Size = 10;
                        range.EntireColumn.AutoFit();
                        range.EntireRow.AutoFit();
                    }

                    //插入資料
                    for (int r = 0; r < ds.Tables[d].Rows.Count; r++)
                    {
                        for (int i = 0; i < ds.Tables[d].Columns.Count; i++)
                        {
                            ws.Cells[r + 2, i + 1] = "'" + ds.Tables[d].Rows[r][i].ToString();
                        }
                    }
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                    range = null;
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
                    ws = null;
                }
                ((Worksheet)workbook.Sheets[1]).Select(true);//選中第一個worksheet
                workbook.Close(true, miss, miss);//關閉workbook, 並儲存對workbook的所有修改

                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                xlapp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp);
                xlapp = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
        }

程式碼段三:

        /// <summary>
        /// 匯出單Sheet 報表
        /// </summary>
        /// <param name="dt">資料</param>
        public void DataToExcle(System.Data.DataTable dt)
        {
            if (dt == null || dt.Rows.Count == 0)
            {
                MessageBox.Show("無資料!");
                return;
            }
            SaveFileDialog saveFileDialog = new SaveFileDialog();

            saveFileDialog.DefaultExt = "xlsx";
            saveFileDialog.Filter = "microsoft office execl files (*.xlsx)|*.xlsx";
            saveFileDialog.RestoreDirectory = true;
            saveFileDialog.Title = "匯出資料到excel表格";
            saveFileDialog.FileName = "報表";
            if (saveFileDialog.ShowDialog() == DialogResult.OK)
            {
                System.Reflection.Missing miss = System.Reflection.Missing.Value;
                Microsoft.Office.Interop.Excel.Application xlapp = new Microsoft.Office.Interop.Excel.Application();
                xlapp.Visible = true;
                Workbooks workbooks = xlapp.Workbooks;
                Workbook workbook = workbooks.Add(true);

                Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];
                Microsoft.Office.Interop.Excel.Range range;
                long totalCount = dt.Rows.Count;
                long totalcolumns = dt.Columns.Count;

                //生成列
                for (int i = 0; i < dt.Columns.Count; i++)
                {
                    worksheet.Cells[1, i + 1] = dt.Columns[i].ColumnName;
                    range = (Microsoft.Office.Interop.Excel.Range)worksheet.Cells[1, i + 1];
                    range.Interior.ColorIndex = 15;
                    range.Font.Bold = true;
                }
                //插入資料
                for (int r = 0; r < dt.Rows.Count; r++)
                {
                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        worksheet.Cells[r + 2, i + 1] = "'" + dt.Rows[r][i].ToString();
                    }
                }
                ((Worksheet)workbook.Sheets[1]).Select(true);//選中第一個worksheet
                workbook.Close(true, miss, miss);//關閉workbook, 並儲存對workbook的所有修改

                System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                xlapp.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(xlapp);
                xlapp = null;
                GC.Collect();
                GC.WaitForPendingFinalizers();
            }
        }

新手寫程式碼,遇大佬指點,不勝感激,感謝觀看

相關推薦

C# 匯出Excel Sheet 單個Sheet

在工作中,會遇到這樣的需求,選取某一年,匯出選擇年份的月度、季度或者年度報表,月度報表不可能產生12個單獨的Excel,這樣的話客戶可能會和你拼命,將12個月份分為12個Sheet放在一個Excel裡面,可能客戶會請你吃飯。 目前的做法是根據選擇的年份,將該年份所有的資料全

.net NPOI匯出EXCELsheet

protected void Button3_Click(object sender, EventArgs e) { DataTable dt = null; string tempprovince = "";

DEV中xtrareport匯出excel,sheet匯出

report1.CreateLayoutViewDocument();  report2.CreateLayoutViewDocument();             report3.CreateLayoutViewDocument();             repo

匯入下載excel(還有excelsheettxt文字的方法

我們經常需要通過上載excel或者是txt文字然後進行處理。。處理excel和txt文字有多種方法,一般都是通過呼叫function  module或者是method來完成: 1、匯入excel並處理:        1)一般這些上載檔案的都要先在       AT SE

dev控制元件匯出Excelsheet

多個GridControl匯出到一個Excel的一個或多個sheet頁 多個DEV控制元件匯出到一個Excel的一個或者多個sheet頁/// <summary> /// DevExpress控制元件通用匯出Excel,支援

【Appnium+C#+Winform自動化測試系列】一、獲取本機連接的設備、啟動Appnium獲取本機啟動的Appnium

net 系列 () 定向 目的 res listening toa 路徑     本系列內容,準備根據所完成的項目為基線,一步一步的把整個設計和實現過程梳理。 先從基本的一些環境問題入手,梳理清楚關於手機設備和Appnium。因為我們在後面的建立Appnium連接時,需要

Excel文件合並到一個Excel文件的工作表(Sheet)裏

ger xlsx eww 右擊 對話 如果 work excel 對話框 實現的功能是把多個Excel文件的第一個工作表(Sheet)合並到一個Excel文件的多個工作表裏,並且新工作表的名稱等於原Excel文件的文件名。開發環境Excel2007,但是Excel

excelsheet表拆分成獨立的excel文件

family AC 項目 OS path color 步驟 box 命名 一、問題:   公司做一個項目,給的用戶上報文是一個包含多個sheet頁的excel文件,   但是在實際處理報文數據的時候需要拆分excel文件為多個獨立的報文excel文件 二、解決:

使用VB指令碼快速將ExcelSheet下的資料歸併到一個Excel

       當遇到要將多個Excel下的資料歸併時,特別是Excel資料量達到GB級別時,複製貼上操作就顯得很LOW,這種傻瓜操作要做幾天幾夜都沒法處理完,外行人只能看Excel發嘆.這時開發工具下的VB編輯器就起作用了.這裡秀一波操作,便利做財務,做資

在 Angularjs 中 ui-sref $state.go 如何傳遞單個引數將物件作為引數

二:傳遞多個引數其實也很簡單可以在上面的單個後面直接拼 1:目標頁面定義需要傳的傳輸個數 .state("default.certquery", { url: "/certquery", controller: "certQueryCtrl", params:{"LoginA

.h.c檔案的使用

func.h #ifndef FUNC_H #define FUNC_H int f(); #endif func.c #include "func.h" int f(){  return 1; } Test.c #include <stdio.h> #in

Angularjs 中 ui-sref $state.go 如何傳遞單個引數將物件作為引數

一: 如何傳遞單個引數 首先,要在目標頁面定義接受的引數: 傳參, ui-sref: $state.Go: 接收引數, 在目標頁面的controller裡注入 stateParams,然後" stateParams,然後 "stateP

python讀取一個excelsheet表併合並

import xlrd import pandas as pd from pandas import DataFrame DATA_DIR = 'E:/' excel_name = '%s2017.xls' % DATA_DIR wb = xlrd.open_workbo

python合併excelsheet

#用python實現將三個excel合併成一個excel #第一個測試檔案 第二個測試檔案 第三個測試檔案 # 其中每個檔案中有多個sheet,需要將其全部合併 import xlrd,xlsxwriter #設定要合併的所有檔案 allxls=["/Users/xubin/myapp/pythonfil

C# params傳遞參數

bject length 多個參數 for 表達 write 數組參數 str ref C#開發語言中 params 是關鍵字,可以指定在參數數目可變處采用參數的方法參數。在函數的參 數數目可變而執行的代碼差異很小的時候很有用! params關鍵字

C++實現給變量傳值

ucs userinfo weibo ref hid gin left use margin 浦88TBR疵95閹TJ糜骯http://weibo.com/u/6348338757 屠貉業17慕M紗杜73油萊http://jz.docin.com/rido621 2B0

c語言的32關鍵字9控制語句

com nbsp 自動變 typedef void unsigned c語言 分享 signed C的32個關鍵字 auto :聲明自動變量 一般不使用double :聲明雙精度變量或函數int: 聲明整型變量或函數struct:聲明結構體變量或函數break:跳出當前循環

C# 合並結構相同的DataTable

all ray AR C# ase HA obj highlight light public DataTable GetAllDataTable(DataSet ds) { DataTable newDataTable = ds.Table

Git 合並commit cherry-pick的使用

-c mit article -abort 開始 撤銷 修改 進入 錯誤 合並多個commit 1、三個commit合並     git rebase -i commit_id     其中,-i 的參數是不需要合並的 commit 的 hash 值,這裏指的是第一條 c

C#下Excel的普通處理報表設計

delete ssi control val 打開 14. bject 配置 ica 一、準備:想要操作Excel,先要在添加2個COM引用: 1、Microsoft Excel 14.0 Object Library (版本不同14.0也可能是12.0等) 2、Micro