使用C#把DataTable内数据写入Excel的方法收集。
一、使用OpenXml方式
//以下是由OpenXml方式把DataTable生成Excel的例子:
public void ExportDataTable(
DataTable table,
string exportFile)
{
//create the empty spreadsheet template and save the file
//using the class generated by the Productivity tool
ExcelDocument excelDocument = new ExcelDocument();
excelDocument.CreatePackage(exportFile);
//populate the data into the spreadsheet
using (SpreadsheetDocument spreadsheet =
SpreadsheetDocument.Open(exportFile, true))
{
WorkbookPart workbook = spreadsheet.WorkbookPart;
//create a reference to Sheet1
WorksheetPart worksheet = workbook.WorksheetParts.Last();
SheetData data = worksheet.Worksheet.GetFirstChild();
//add column names to the first row
Row header = new Row();
header.RowIndex = (UInt32)1;
foreach (DataColumn column in table.Columns)
{
Cell headerCell = createTextCell(
table.Columns.IndexOf(column) + 1,
1,
column.ColumnName);
header.AppendChild(headerCell);
}
data.AppendChild(header);
//loop through each data row
DataRow contentRow;
for (int i = 0;i < table.Rows.Count; i++)
{
contentRow = table.Rows[i];
data.AppendChild(createContentRow(contentRow, i + 2));
}
}
}
private Cell createTextCell(
int columnIndex,
int rowIndex,
object cellValue)
{
Cell cell = new Cell();
cell.DataType = CellValues.InlineString;
cell.CellReference = getColumnName(columnIndex) + rowIndex;
InlineString inlineString = new InlineString();
Text t = new Text();
t.Text = cellValue.ToString();
inlineString.AppendChild(t);
cell.AppendChild(inlineString);
return cell;
}
private Row createContentRow(
DataRow dataRow,
int rowIndex)
{
Row row = new Row
{
RowIndex = (UInt32)rowIndex
};
for (int i = 0; i < dataRow.Table.Columns.Count; i++)
{
Cell dataCell = createTextCell(i + 1, rowIndex, dataRow[i]);
row.AppendChild(dataCell);
}
return row;
}
private string getColumnName(int columnIndex)
{
int dividend = columnIndex;
string columnName = String.Empty;
int modifier;
while (dividend > 0)
{
modifier = (dividend – 1) % 26;
columnName =
Convert.ToChar(65 + modifier).ToString() + columnName;
dividend = (int)((dividend – modifier) / 26);
}
return columnName;
}
注意:该方法需要微软的OpenXML SDK 2.0支持。
二、OleDB方式
public string ExportTable2ExcelFile(DataTable dt, string strWorkSheetName)//, string ModelFile)
{
if (File.Exists(this.FileName) == false)
{
return "指定文件不存在!";
}
if (dt == null)
{
return "数据不能为空!";
}
if (strWorkSheetName.ToString() == "")
{
return "数据表名不可以为空!";
}
dt.TableName = strWorkSheetName;
int iRows = dt.Rows.Count;
int iCols = dt.Columns.Count;
StringBuilder stringBuilder;
if (iRows == 0)
{
return "没有可导入数据!";
}
stringBuilder = new StringBuilder();
//先查看此Excel中是否有相关Table,如果有的话就删除,然后导入新的。
//生成创建表的脚本
stringBuilder.Append("CREATE TABLE ");
stringBuilder.Append(dt.TableName + " ( ");
for (int i = 0; i < iCols; i++)
{
//此处是本版本改进中最实用的地方
string strType = GetOleDataType(dt.Columns[i]);
if (i < iCols - 1)
stringBuilder.Append(string.Format("{0} {1},", dt.Columns[i].ColumnName, strType));
else
stringBuilder.Append(string.Format("{0} {1})", dt.Columns[i].ColumnName, strType));
}
using (this.Connection)
{
//控制进度条
int iCount = 1, iTotal = dt.Rows.Count + 4;
OleDbCommand objCmd = new OleDbCommand();
objCmd.Connection = this.Connection;
//插入新表
objCmd.CommandText = stringBuilder.ToString();
try
{
this.Connection.Open();
//插入新表
objCmd.ExecuteNonQuery();
}
catch (Exception e)
{
return "在Excel中创建表失败!错误信息:" + e.Message;
}
stringBuilder.Remove(0, stringBuilder.Length);
stringBuilder.Append("INSERT INTO ");
stringBuilder.Append(dt.TableName + " ( ");
//先插入标头
for (int i = 0; i < iCols; i++)
{
if (i < iCols - 1)
stringBuilder.Append(dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append(dt.Columns[i].ColumnName + ") values (");
}
for (int i = 0; i < iCols; i++)
{
if (i < iCols - 1)
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ",");
else
stringBuilder.Append("@" + dt.Columns[i].ColumnName + ")");
}
//建立插入动作的Command
objCmd.CommandText = stringBuilder.ToString();
OleDbParameterCollection oleParam = objCmd.Parameters;
oleParam.Clear();
for (int i = 0; i < iCols; i++)
{
OleDbType oleDbType = GetRefOleDataType(dt.Columns[i]);
//此处是本版本改进中最实用的地方
oleParam.Add(new OleDbParameter("@" + dt.Columns[i].ColumnName, oleDbType));
}
//遍历DataTable将数据插入新建的Excel文件中
foreach (DataRow row in dt.Rows)
{
for (int i = 0; i < oleParam.Count; i++)
{
oleParam[i].Value = row[i];
}
objCmd.ExecuteNonQuery();
}
if (this.Connection.State == ConnectionState.Open)
{
this.Connection.Close();
}
return "数据已成功导入Excel!";
}
}
该方法中的OleDB连接Connection的具体实现和 Excel文件名我就没有贴出来了,朋友们可以自己去实现。
注意:该方法不能自动创建Excel文件,所以使用该方法需要先创建好Excel文件才能使用。
三、使用Com组件实现Excel数据写入
该方法在网上列子较多,由于时间关系,这里我就不代码列举了(以后有时间再来补上)。
注意:该方法需要引用Com组件(Microsoft Office 12.0 Object Library :Office 2007;Microsoft Office 14.0 Object Library :Office 2010;
Microsoft Office 8.0 Object Library:Office2003)。
引用一下链接:http://blog.csdn.net/tider_ys/article/details/6590060 (.net 3种自动导出带图片的excel方法)可以借鉴学习。