数据流方式
这种方法的优点就是导出比较快,但是excel的表格里面设置标题,字体样式等都不能弄,因为是用数据流直接导出为excel的,除非能在数据流中设置这些样式。24000*23的数据只需耗时23毫秒
/// <summary>
/// 以数据流的方式导出
/// </summary>
/// <param name="saveFileDialog">SaveFileDialog对话框</param>
/// <param name="dt">DataTable</param>
public static void ExportDataToExcel(Microsoft.Win32.SaveFileDialog saveFileDialog,System.Data.DataTable dt)
{
Stream stream = saveFileDialog.OpenFile();
StreamWriter sw = new StreamWriter(stream,System.Text.Encoding.GetEncoding(-0));
string str = "";
try
{
for (int i = 0; i < dt.Columns.Count; i++)
{
if (i > 0)
{
str += "\t";
}
str += dt.Columns[i].ColumnName;
}
sw.WriteLine(str);
for (int j = 0; j < dt.Rows.Count; j++)
{
string tempStr = "";
for (int k = 0; k < dt.Columns.Count; k++)
{
if (k > 0)
{
tempStr += "\t";
}
tempStr += dt.Rows[j][k].ToString();
}
sw.WriteLine(tempStr);
}
sw.Close();
stream.Close();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
finally
{
sw.Close();
stream.Close();
}
}
使用COM.Excel.dll
需添加COM.Excel.dll,直接写成了一个EXCEL文件,导出24000*23数据耗时9秒左右。没有使用任何EXCEL组件,直接写成了一个EXCEL文件 只能导出数据不能去操作相应的EXCEl表格,不能对EXCEL中的数据进行格式化操作,如:字体颜色,大小,单元格合并等
/// <summary>
/// 将DataTable的数据导出显示为Excel报表(不使用Excel对象)
/// </summary>
/// <param name="dt">DataTable</param>
/// <param name="FilePath">路径</param>
public static void DataExcel(System.Data.DataTable dt, string FilePath)
{
COM.Excel.cExcelFile excel = new COM.Excel.cExcelFile();
excel.CreateFile(FilePath);
excel.PrintGridLines =true;
//设置字体
COM.Excel.cExcelFile.FontFormatting ff = COM.Excel.cExcelFile.FontFormatting.xlsNoFormat;
string font = "宋体";
short fontsize = 14;
excel.SetFont(ref font, ref fontsize, ref ff);
//列宽
byte b1 = 1,
b2 = 23;
short s3 = 18;
excel.SetColumnWidth(ref b1, ref b2, ref s3);
COM.Excel.cExcelFile.ValueTypes vt = COM.Excel.cExcelFile.ValueTypes.xlsText;
COM.Excel.cExcelFile.CellFont cf = COM.Excel.cExcelFile.CellFont.xlsFont1;
COM.Excel.cExcelFile.CellAlignment ca = COM.Excel.cExcelFile.CellAlignment.xlsCentreAlign;
COM.Excel.cExcelFile.CellHiddenLocked chl = COM.Excel.cExcelFile.CellHiddenLocked.xlsNormal;
int cellformat = 1;
int rowIndex = 1;//起始行
int colIndex = 0;
//取得列标题
foreach (System.Data.DataColumn colhead in dt.Columns)
{
colIndex++;
string name = colhead.ColumnName.Trim();
object namestr = (object)name;
excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref namestr, ref cellformat);
}
//取得表格中的数据
foreach (System.Data.DataRow row in dt.Rows)
{
rowIndex++;
colIndex = 0;
foreach (System.Data.DataColumn col in dt.Columns)
{
colIndex++;
if (col.DataType == System.Type.GetType("System.DateTime")) //是否是日期数据
{
object str = (object)(Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd"); ;
excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref str, ref cellformat);
}
else
{
object str = (object)row[col.ColumnName].ToString();
excel.WriteValue(ref vt, ref cf, ref ca, ref chl, ref rowIndex, ref colIndex, ref str, ref cellformat);
}
}
}
excel.CloseFile();
}
方法网上还有很多,我就整理了这些