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匯出EXCEL多個sheet
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(還有excel多個sheet)和txt文字的方法
我們經常需要通過上載excel或者是txt文字然後進行處理。。處理excel和txt文字有多種方法,一般都是通過呼叫function module或者是method來完成: 1、匯入excel並處理: 1)一般這些上載檔案的都要先在 AT SE
dev多控制元件匯出到Excel多個sheet頁
多個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
excel多個sheet表拆分成獨立的excel文件
family AC 項目 OS path color 步驟 box 命名 一、問題: 公司做一個項目,給的用戶上報文是一個包含多個sheet頁的excel文件, 但是在實際處理報文數據的時候需要拆分excel文件為多個獨立的報文excel文件 二、解決:
使用VB指令碼快速將多個Excel多個Sheet下的資料歸併到一個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讀取一個excel多個sheet表併合並
import xlrd import pandas as pd from pandas import DataFrame DATA_DIR = 'E:/' excel_name = '%s2017.xls' % DATA_DIR wb = xlrd.open_workbo
python合併excel多個sheet
#用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