C#如何將DataTable導(dǎo)出到Excel解決方案
更新時(shí)間:2012年11月22日 17:44:48 作者:
由于公司項(xiàng)目中需要將系統(tǒng)內(nèi)用戶(hù)操作的所有日志進(jìn)行轉(zhuǎn)存?zhèn)浞?,考慮到以后可能還需要還原,所以最后決定將日志數(shù)據(jù)備份到Excel中
最近,由于公司項(xiàng)目中需要將系統(tǒng)內(nèi)用戶(hù)操作的所有日志進(jìn)行轉(zhuǎn)存?zhèn)浞?,考慮到以后可能還需要還原,所以最后決定將日志數(shù)據(jù)備份到Excel中。
下面是我項(xiàng)目當(dāng)中Excel.cs這個(gè)類(lèi)的全部代碼,通過(guò)這個(gè)類(lèi)可以很容易地將DataTable中的數(shù)據(jù)導(dǎo)入到Excel方法中。
首先,必須要下載NPOI.dll這個(gè)程序集,
類(lèi)代碼如下:
using System;
using NPOI.HSSF;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using System.Collections;
using System.IO;
using System.Data;
namespace BackupAttach
{
public class Excel
{
private HSSFWorkbook _workBook;
private ISheet _wbSheet = null;
private DataColumnCollection _columns = null;
private int _col = 0; //total columns
private int _row = 0; //total rows
private int _sheet = 0; //total sheets
private int _sheetRowNum = 65536; //each sheet allow rows
public Excel()
{
InstanceWorkBook();
}
/// <summary>
/// 實(shí)例方法
/// </summary>
/// <param name="sheetRowNum">單個(gè)表單允許的最大行數(shù)</param>
public Excel(int sheetRowNum)
{
_sheetRowNum = sheetRowNum;
InstanceWorkBook();
}
/// <summary>
/// 實(shí)例方法
/// </summary>
/// <param name="columns">表頭</param>
public Excel(DataColumnCollection columns)
{
_columns = columns;
InstanceWorkBook();
}
private void InstanceWorkBook()
{
/////cretate WorkBook
_workBook = new HSSFWorkbook();
var dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "BaiyiTimes";
_workBook.DocumentSummaryInformation = dsi;
////create a entry of SummaryInformation
var si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "Etimes Secure Document System Log Backup";
_workBook.SummaryInformation = si;
}
private DataColumnCollection GetColumns(DataColumnCollection columns)
{
return columns == null || columns.Count == 0 ? _columns : columns;
}
private ISheet GetSheet(ISheet sheet)
{
return sheet == null ? _wbSheet : sheet;
}
private void CreateHeader(ISheet sheet, DataColumnCollection columns)
{
_columns = GetColumns(columns);
/////create row of column
var oRow = sheet.CreateRow(0);
foreach (DataColumn column in _columns)
{
var oCell = oRow.CreateCell(_col);
var style1 = _workBook.CreateCellStyle();
style1.FillForegroundColor = HSSFColor.BLUE.index2;
style1.FillPattern = FillPatternType.SOLID_FOREGROUND;
style1.Alignment = HorizontalAlignment.CENTER;
style1.VerticalAlignment = VerticalAlignment.CENTER;
var font = _workBook.CreateFont();
font.Color = HSSFColor.WHITE.index;
style1.SetFont(font);
oCell.CellStyle = style1;
var name = column.ColumnName;
oCell.SetCellValue(name.ToString());
_col++;
}
///// header belong to rows
_row++;
}
private void CreateHeader(ISheet sheet)
{
CreateHeader(sheet, null);
}
public ISheet CreateSheet()
{
return CreateSheet(null);
}
public ISheet CreateSheet(DataColumnCollection columns)
{
_wbSheet = _workBook.CreateSheet((_sheet + 1).ToString());
CreateHeader(_wbSheet, columns);
_sheet++;
return _wbSheet;
}
public void SetRowValue(DataRowCollection rows, ISheet sheet)
{
_wbSheet = GetSheet(sheet);
foreach (DataRow row in rows)
{
SetRowValue(row);
}
}
public void SetRowValue(DataRowCollection rows)
{
SetRowValue(rows, null);
}
public void SetRowValue(DataRow row)
{
// create a new sheet
if (_row % _sheetRowNum == 0)
{
CreateSheet();
}
var oRow = _wbSheet.CreateRow(_row % _sheetRowNum);
var obj = string.Empty;
var cell = 0;
foreach (DataColumn column in _columns)
{
obj = row[column.ColumnName].ToString();
oRow.CreateCell(cell).SetCellValue(obj);
cell++;
}
_row++;
}
public void SetProtectPassword(string password, string username)
{
_workBook.WriteProtectWorkbook(password, username);
}
public void SaveAs(string filePath)
{
if (File.Exists(filePath)) File.Delete(filePath);
var file = new FileStream(filePath, FileMode.Create);
_workBook.Write(file);
file.Close();
}
}
}
下面給出小Demo共參考:
public void DataTableToExcel(DataTable dt,string path)
{
//instance excel object
//Excel excel = new Excel(65536);
Excel excel = new Excel();
//create a sheet
excel.CreateSheet(dt.Columns);
//write value into rows
//excel.SetRowValue(dt.Rows);
foreach (DataRow row in dt.Rows)
{
excel.SetRowValue(row);
}
// set excel protected
excel.SetProtectPassword("etimes2011@", "baiyi");
// save excel file to local
excel.SaveAs(path);
}
缺點(diǎn):如果要導(dǎo)入到Excel中的數(shù)據(jù)量較多時(shí)(幾十萬(wàn)或者幾百萬(wàn)行),全部一次性放到DataTable中可能會(huì)對(duì)內(nèi)存消耗很大,建議每次導(dǎo)入的數(shù)據(jù)最好不要超過(guò)1000條,可采取分頁(yè)查詢(xún)的方式將數(shù)據(jù)導(dǎo)入Excel中。
優(yōu)點(diǎn):1997-2003版本的xls中每個(gè)表單最大只支持65536行,2010可以支持1048576行,考慮到客戶(hù)機(jī)上安裝的版本不一樣,故Excel對(duì)象每個(gè)表單最大支持65536行,當(dāng)表單到達(dá)最大行數(shù)時(shí),Excel對(duì)象內(nèi)部會(huì)自動(dòng)創(chuàng)建新表單,在往Excel中寫(xiě)數(shù)據(jù)的時(shí)候不用考慮這一點(diǎn),這樣調(diào)用的時(shí)候更為方便
下面是我項(xiàng)目當(dāng)中Excel.cs這個(gè)類(lèi)的全部代碼,通過(guò)這個(gè)類(lèi)可以很容易地將DataTable中的數(shù)據(jù)導(dǎo)入到Excel方法中。
首先,必須要下載NPOI.dll這個(gè)程序集,
類(lèi)代碼如下:
復(fù)制代碼 代碼如下:
using System;
using NPOI.HSSF;
using NPOI.HPSF;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using System.Collections;
using System.IO;
using System.Data;
namespace BackupAttach
{
public class Excel
{
private HSSFWorkbook _workBook;
private ISheet _wbSheet = null;
private DataColumnCollection _columns = null;
private int _col = 0; //total columns
private int _row = 0; //total rows
private int _sheet = 0; //total sheets
private int _sheetRowNum = 65536; //each sheet allow rows
public Excel()
{
InstanceWorkBook();
}
/// <summary>
/// 實(shí)例方法
/// </summary>
/// <param name="sheetRowNum">單個(gè)表單允許的最大行數(shù)</param>
public Excel(int sheetRowNum)
{
_sheetRowNum = sheetRowNum;
InstanceWorkBook();
}
/// <summary>
/// 實(shí)例方法
/// </summary>
/// <param name="columns">表頭</param>
public Excel(DataColumnCollection columns)
{
_columns = columns;
InstanceWorkBook();
}
private void InstanceWorkBook()
{
/////cretate WorkBook
_workBook = new HSSFWorkbook();
var dsi = PropertySetFactory.CreateDocumentSummaryInformation();
dsi.Company = "BaiyiTimes";
_workBook.DocumentSummaryInformation = dsi;
////create a entry of SummaryInformation
var si = PropertySetFactory.CreateSummaryInformation();
si.Subject = "Etimes Secure Document System Log Backup";
_workBook.SummaryInformation = si;
}
private DataColumnCollection GetColumns(DataColumnCollection columns)
{
return columns == null || columns.Count == 0 ? _columns : columns;
}
private ISheet GetSheet(ISheet sheet)
{
return sheet == null ? _wbSheet : sheet;
}
private void CreateHeader(ISheet sheet, DataColumnCollection columns)
{
_columns = GetColumns(columns);
/////create row of column
var oRow = sheet.CreateRow(0);
foreach (DataColumn column in _columns)
{
var oCell = oRow.CreateCell(_col);
var style1 = _workBook.CreateCellStyle();
style1.FillForegroundColor = HSSFColor.BLUE.index2;
style1.FillPattern = FillPatternType.SOLID_FOREGROUND;
style1.Alignment = HorizontalAlignment.CENTER;
style1.VerticalAlignment = VerticalAlignment.CENTER;
var font = _workBook.CreateFont();
font.Color = HSSFColor.WHITE.index;
style1.SetFont(font);
oCell.CellStyle = style1;
var name = column.ColumnName;
oCell.SetCellValue(name.ToString());
_col++;
}
///// header belong to rows
_row++;
}
private void CreateHeader(ISheet sheet)
{
CreateHeader(sheet, null);
}
public ISheet CreateSheet()
{
return CreateSheet(null);
}
public ISheet CreateSheet(DataColumnCollection columns)
{
_wbSheet = _workBook.CreateSheet((_sheet + 1).ToString());
CreateHeader(_wbSheet, columns);
_sheet++;
return _wbSheet;
}
public void SetRowValue(DataRowCollection rows, ISheet sheet)
{
_wbSheet = GetSheet(sheet);
foreach (DataRow row in rows)
{
SetRowValue(row);
}
}
public void SetRowValue(DataRowCollection rows)
{
SetRowValue(rows, null);
}
public void SetRowValue(DataRow row)
{
// create a new sheet
if (_row % _sheetRowNum == 0)
{
CreateSheet();
}
var oRow = _wbSheet.CreateRow(_row % _sheetRowNum);
var obj = string.Empty;
var cell = 0;
foreach (DataColumn column in _columns)
{
obj = row[column.ColumnName].ToString();
oRow.CreateCell(cell).SetCellValue(obj);
cell++;
}
_row++;
}
public void SetProtectPassword(string password, string username)
{
_workBook.WriteProtectWorkbook(password, username);
}
public void SaveAs(string filePath)
{
if (File.Exists(filePath)) File.Delete(filePath);
var file = new FileStream(filePath, FileMode.Create);
_workBook.Write(file);
file.Close();
}
}
}
下面給出小Demo共參考:
復(fù)制代碼 代碼如下:
public void DataTableToExcel(DataTable dt,string path)
{
//instance excel object
//Excel excel = new Excel(65536);
Excel excel = new Excel();
//create a sheet
excel.CreateSheet(dt.Columns);
//write value into rows
//excel.SetRowValue(dt.Rows);
foreach (DataRow row in dt.Rows)
{
excel.SetRowValue(row);
}
// set excel protected
excel.SetProtectPassword("etimes2011@", "baiyi");
// save excel file to local
excel.SaveAs(path);
}
缺點(diǎn):如果要導(dǎo)入到Excel中的數(shù)據(jù)量較多時(shí)(幾十萬(wàn)或者幾百萬(wàn)行),全部一次性放到DataTable中可能會(huì)對(duì)內(nèi)存消耗很大,建議每次導(dǎo)入的數(shù)據(jù)最好不要超過(guò)1000條,可采取分頁(yè)查詢(xún)的方式將數(shù)據(jù)導(dǎo)入Excel中。
優(yōu)點(diǎn):1997-2003版本的xls中每個(gè)表單最大只支持65536行,2010可以支持1048576行,考慮到客戶(hù)機(jī)上安裝的版本不一樣,故Excel對(duì)象每個(gè)表單最大支持65536行,當(dāng)表單到達(dá)最大行數(shù)時(shí),Excel對(duì)象內(nèi)部會(huì)自動(dòng)創(chuàng)建新表單,在往Excel中寫(xiě)數(shù)據(jù)的時(shí)候不用考慮這一點(diǎn),這樣調(diào)用的時(shí)候更為方便
您可能感興趣的文章:
- C#操作EXCEL DataTable轉(zhuǎn)換的實(shí)例代碼
- C#將Excel中的數(shù)據(jù)轉(zhuǎn)換成DataSet
- C#實(shí)現(xiàn)將DataTable內(nèi)容輸出到Excel表格的方法
- C#使用Datatable導(dǎo)出Excel
- C#中DataGridView導(dǎo)出Excel的兩種方法
- C#把EXCEL數(shù)據(jù)轉(zhuǎn)換成DataTable
- C#把DataTable導(dǎo)出為Excel文件
- C#實(shí)現(xiàn)讀取Excel文件并將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)和DataTable
- C#中ExcelDataReader的具體使用
相關(guān)文章
C# 定時(shí)器?;顧C(jī)制引起的內(nèi)存泄露問(wèn)題解決
這篇文章主要介紹了C# 定時(shí)器保活機(jī)制引起的內(nèi)存泄露問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
c# DataTable與不同結(jié)構(gòu)實(shí)體類(lèi)轉(zhuǎn)換的方法實(shí)例
這篇文章主要介紹了c#的DataTable與不同結(jié)構(gòu)實(shí)體類(lèi)轉(zhuǎn)換的方法實(shí)例,在大數(shù)據(jù)量的情況下很實(shí)用,大家可以參考使用2013-11-11
Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存)
這篇文章主要介紹了Silverlight文件上傳下載實(shí)現(xiàn)方法(下載保存) ,需要的朋友可以參考下2015-11-11
OpenCvSharp實(shí)現(xiàn)Mat對(duì)象簡(jiǎn)單的像素操作
這篇文章主要介紹了OpenCvSharp實(shí)現(xiàn)Mat對(duì)象簡(jiǎn)單的像素操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
C#設(shè)計(jì)模式實(shí)現(xiàn)之迭代器模式
迭代器模式把對(duì)象的職責(zé)分離,職責(zé)分離可以最大限度減少彼此之間的耦合程度,從而建立一個(gè)松耦合的對(duì)象,這篇文章主要給大家介紹了關(guān)于C#設(shè)計(jì)模式實(shí)現(xiàn)之迭代器模式的相關(guān)資料,需要的朋友可以參考下2021-08-08
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)...2007-08-08

