從DataTable高效率導出數據到Excel

来源:http://www.cnblogs.com/Scl891004X/archive/2017/05/24/6900160.html
-Advertisement-
Play Games

首先從資料庫讀取數據到DataTable,這我就不提了,大家都明白。下麵直接介紹如何從DataTable高效率導出數據到Excel中的方法,代碼如下: 說明: 1)上述方法中,將DataTable單元格內容寫入數組後一次性賦值給Excel的Range,效率非常高,比之迴圈DataTable單元格逐個 ...


首先從資料庫讀取數據到DataTable,這我就不提了,大家都明白。下麵直接介紹如何從DataTable高效率導出數據到Excel中的方法,代碼如下:

 1 using Microsoft.Office.Interop.Excel;
 2 using System.Runtime.InteropServices;
 3 
 4 [DllImport("User32.dll", CharSet = CharSet.Auto)]
 5 public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int pid);
 6 //函數原型;DWORD GetWindowThreadProcessld(HWND hwnd,LPDWORD lpdwProcessld);
 7 //參數:hWnd:視窗句柄
 8 //參數:lpdwProcessld:接收進程標識的32位值的地址。如果這個參數不為NULL,GetWindwThreadProcessld將進程標識拷貝到這個32位值中,否則不拷貝
 9 //返回值:返回值為創建視窗的線程標識。
10 
11 //dt:從資料庫讀取的數據;file_name:保存路徑;sheet_name:表單名稱
12 private void DataTableToExcel(DataTable dt, string file_name, string sheet_name)
13 {
14        Microsoft.Office.Interop.Excel.Application Myxls = new  Microsoft.Office.Interop.Excel.Application();
15        Microsoft.Office.Interop.Excel.Workbook Mywkb = Myxls.Workbooks.Add();
16        Microsoft.Office.Interop.Excel.Worksheet MySht = Mywkb.ActiveSheet;
17        MySht.Name = sheet_name;
18        Myxls.Visible = false;
19        Myxls.DisplayAlerts = false;
20        try
21        {
22               //寫入表頭
23               object[] arrHeader = new object[dt.Columns.Count];
24               for(int i = 0; i < dt.Columns.Count; i++)
25               {
26                      arrHeader[i] = dt.Columns[i].ColumnName;
27               }
28               MySht.Range[Mysht.Cells[1,1], MySht.Cells[1,dt.Columns.Count]].Value2 = arrHeader;
29               //寫入表體數據
30               object[,] arrBody = new object[dt.Rows.Count, dt.Columns.Count];
31               for(int i = 0; i < dt.Rows.Count; i++)
32               {
33                       for(int j = 0; j < dt.Columns.Count; j++)
34                       {
35                               arrBody[i,j] = dt.Rows[i][j].ToString();
36                       }
37               }
38               MySht.Range[MySht.Cells[2,1], MySht.Cells[dt.Rows.Count + 1, dt.Columns.Count]].Value2 = arrBody;
39               if(Mywkb != null)
40               {
41                       Mywkb.SaveAs(file_name);
42                       Mywkb.Close(Type.Missing, Type.Missing, Type.Missing);
43                       Mywkb = null;
44               }
45        }
46        catch(Exception ex)
47        {
48                MessageBox.Show(ex.Message, "系統提示");
49        }
50        finally
51        {
52                 //徹底關閉Excel進程
53                 if(Myxls != null)
54                 {
55                        Myxls.Quit();
56                        try
57                        {
58                               if(Myxls != null)
59                               {
60                                     int pid;
61                                     GetWindowThreadProcessId(new IntPtr(Myxls.Hwnd), out pid);
62                                     System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(pid);
63                                      p.Kill();
64                               }
65                        }
66                        catch(Exception ex)
67                        {
68                               MessageBox.Show("結束當前EXCEL進程失敗:" + ex.Message);
69                        }
70                        Myxls = null;
71                 }
72                 GC.Collect();
73        }
74 }

說明:

1)上述方法中,將DataTable單元格內容寫入數組後一次性賦值給Excel的Range,效率非常高,比之迴圈DataTable單元格逐個賦值給Excel的Cell的方法,速度快多了;

2)上述方法中用到的徹底關閉Excel進程的方式,也值得註意。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 不知道大家有沒有發現,在一個 Objective-C 和 Swift 混編的 App 中,當把一個 OC 中的參數轉到 Swift 時,Swift 會自動把這個變數進行強制解包。舉個例子,我在 OC 中定義這樣一個變數: 它轉成 Swift 就變成了這樣: 這樣看上去合情合理。Swift 中有 St ...
  • 首先看一下什麼是GTID: GTID(Global Transaction ID)是對於一個已提交事務的編號,並且是一個全局唯一的編號。 GTID實際上是由UUID+TID組成的。其中UUID是一個MySQL實例的唯一標識。TID代表了該實例上已經提交的事務數量,並且隨著事務提交單調遞增。根據GTI ...
  • Neo4j使用Cypher查詢圖形數據,Cypher是描述性的圖形查詢語言,語法簡單,功能強大,由於Neo4j在圖形資料庫家族中處於絕對領先的地位,擁有眾多的用戶基數,使得Cypher成為圖形查詢語言的事實上的標準。本文作為入門級的教程,我不會試圖分析Cypher語言的全部內容,本文的目標是循序漸進 ...
  • " 1、同義詞 " " 2、Flashback 技術 " " 3、連接字元串的寫法 " " 4、轉義字元 & 特殊運算符 " " 5、文件類型 " " 6、查看參數 & 修改參數 " " 7、AWR 工具 " " 8、學習方法 & 學習資料 " 1、同義詞 概念 同義詞是資料庫對象的一個別名,常用於 ...
  • ———————————————————————————————————————————— 直流電動機應用實例 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • Java中這個類庫叫POI,C#中叫NPOI,很多從Java一直到.Net平臺的類庫為了區別大部分都是在前面加個N,比如Hibernate和NHibernate。 npoi下載地址 一、使用NPOI下載大致分以下步驟: 1、創建workbook 2、創建sheet 3、創建row和cell 4、填充 ...
  • 一、查看外網是否通暢 配置網路yum源(需要保證外網開通,我這裡是使用網易163提供開源鏡像站) 二、下載repo文件 三. 備份並替換系統的repo文件 備份原來的.repo配置文件 複製網易下載的.repo並修改文件名稱 四、執行yum源更新 清除以前使用yum的緩存 建立一個緩存,以後方便在緩 ...
  • 在後臺編寫Linq查詢的時候,有時我們寫的查詢語句,系統會給出一個警告:possible multiple enumeration of ienumerable. 出現這個警告的原因是: 如果該查詢是對資料庫的查詢,那麼該查詢語句會從資料庫執行兩次及以上,我們可以對這個查詢進行優化,優化的方法是 將 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...