C#由DataSet匯出Excel檔案的幾種方法
裡面的方法很多。
我只成功運行了下面四種(稍作修改並添加了一些總結),其他的方法,沒能成功執行。
不過感興趣的可以看一下,因為即使不能執行(不能執行的原因有很多,差一點都不行),其思路還是值得參考學習的。
//法一
private void ToExcel(DataSet dataSet, bool isShowExcel)
{
DataTable dataTable = dataSet.Tables[0];
int rowNumber = dataTable.Rows.Count;
int columnNumber = dataTable.Columns.Count;
if (rowNumber == 0)
{
MessageBox.Show("沒有任何資料可以匯入到Excel檔案!");
}
//建立Excel物件
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible = isShowExcel;//是否開啟該Excel檔案
//填充資料
for (int c = 0; c < rowNumber; c++)
{
for (int j = 0; j < columnNumber; j++)
{
//c=0,j=0,對應的是dataTable中的除去表頭那一行的第一行第一列元素
excel.Cells[c + 1, j + 1] = dataTable.Rows[c].ItemArray[j];
}
}
}
*DataSet、DataTable物件、Excel物件是基本的必要的物件
*沒有欄位名稱,
*直接開啟一個excel檔案,裡面是dataset中的資料。
*關閉不儲存,程式會報錯
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//法二
private void ToExcel(DataSet dataSet, bool isShowExcel)
{
DataTable dataTable = dataSet.Tables[0];
int rowNumber = dataTable.Rows.Count;
int rowIndex = 1;
int colIndex = 0;
//建立Excel物件
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible = isShowExcel;
//生成欄位名稱,利用DataColumn的ColumnName屬性
foreach (DataColumn col in dataTable.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;
}
//填充資料
foreach (DataRow row in dataTable.Rows)
{
rowIndex++;
colIndex = 0;
foreach (DataColumn col in dataTable.Columns)
{
colIndex++;
excel.Cells[rowIndex, colIndex] = row[col.ColumnName];
}
}
}
*DataSet、DataTable物件、Excel物件
*利用DataColumn的ColumnName屬性
*有欄位名稱,
*裡面是dataset中的資料,儲存或不儲存都沒問題
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//法三
private void ToExcel(DataSet dataSet, bool isShowExcel)
{
DataTable dataTable = dataSet.Tables[0];
int rowNumber = dataTable.Rows.Count;//不包括欄位名
int columnNumber = dataTable.Columns.Count;
int colIndex = 0;
//建立Excel物件
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
//這樣就只會開啟一個sheet,不會出現下面說到的開啟兩個sheet:一個空白,一個有資料的情況
Microsoft.Office.Interop.Excel.Workbook workbook = excel.ActiveWorkbook;
Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.ActiveSheet;
excel.Visible = isShowExcel;
Microsoft.Office.Interop.Excel.Range range;
//生成欄位名稱
foreach (DataColumn col in dataTable.Columns)
{
colIndex++;
excel.Cells[1, colIndex] = col.ColumnName;
}
object[,] objData = new object[rowNumber, columnNumber];
for (int r = 0; r < rowNumber; r++)
{
for (int c = 0; c < columnNumber; c++)
{
objData[r, c] = dataTable.Rows[r][c];
}
Application.DoEvents();
}
// 寫入Excel
range=excel.get_Range((object)worksheet.Cells[2, 1], (object)worksheet.Cells[rowNumber + 1, columnNumber]);
range.NumberFormat = "@";//設定單元格為文字格式
range.Value2 = objData;
excel.get_Range((object)worksheet.Cells[2, 1], (object)worksheet.Cells[rowNumber + 1, 1]).NumberFormat = "yyyy-m-d h:mm";
}
*DataSet、DataTable物件、Excel物件、workbook物件、Worksheet物件、Range物件
*利用DataColumn的ColumnName屬性
*有欄位名稱
*可以儲存或不儲存,可以選擇儲存位置
*使用workbook和workshee時可能會開啟兩個excel(準確的說是兩個sheet),一個空白,一個有資料。
*建立workbook的時候會預設創建出一個worksheet,使用ActiveSheet就可以得到這個worksheet
*上面的程式碼是改過的,不會出現這種情況
*匯出時能看出來速度比方法二快
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//法四
private void ToExcel(DataSet dataSet, bool isShowExcel)
{
DataTable dataTable = dataSet.Tables[0];
int rowNumber = dataTable.Rows.Count;
int columnNumber = dataTable.Columns.Count;
String stringBuffer = "";
if (rowNumber == 0)
{
MessageBox.Show("沒有任何資料可以匯入到Excel檔案!");
}
//建立Excel物件
Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
excel.Application.Workbooks.Add(true);
excel.Visible = isShowExcel;//是否開啟該Excel檔案
//填充資料
for (int i = 0; i < rowNumber; i++)
{
for (int j = 0; j < columnNumber; j++)
{
stringBuffer += dataTable.Rows[i].ItemArray[j].ToString();
if (j < columnNumber - 1)
{
stringBuffer += "\t";
}
}
stringBuffer += "\n";
}
Clipboard.Clear();
Clipboard.SetDataObject(stringBuffer);
((Microsoft.Office.Interop.Excel.Range)excel.Cells[1, 1]).Select();
((Microsoft.Office.Interop.Excel.Worksheet)excel.ActiveWorkbook.ActiveSheet).Paste(Missing.Value, Missing.Value);
Clipboard.Clear();
}
*DataSet、DataTable物件、Excel物件
*利用string
*利用Clipboard
*沒有欄位名稱
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~