您的位置:首页 > 编程语言 > ASP

NPOI、MyXls、Aspose.Cells 导入导出Excel

2012-03-21 16:51 519 查看

Excel导入及导出问题产生:

  从接触.net到现在一直在维护一个DataTable导s出到Excel的类,时不时还会维护一个导入类。以下是时不时就会出现的问题:

导出问题:

  如果是asp.net,你得在服务器端装Office,几百M呢,还得及时更新它,以防漏洞,还得设定权限允许ASP.net访问COM+,听说如果导出过程中出问题可能导致服务器宕机。

  Excel会把只包含数字的列进行类型转换,本来是文本型的,它非要把你转成数值型的,像身份证后三位变成000,编号000123会变成123,够智能吧,够郁闷吧。不过这些都还是可以变通解决的,在他们前边加上一个字母,让他们不只包含数字。

  导出时,如果你的字段内容以"-"或"="开头,Excel好像把它当成了公式什么的,接下来就出错,提示:类似,保存到Sheet1的问题

导入问题:

  Excel会根据你的Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为你这一列就是数值型的,然后,身份证,手机,编号都转吧变成类似这样的1.42702E+17格式,日期列变成包含日期和数字的,乱的很,可以通过改注册表让Excel分析整个表,但如果整列都是数字,那这个问题还是解决不了。

以上问题,一般人初次做时肯定得上网查查吧,一个问题接着另一个问题,查到你郁郁而死,还有很多问题没解决,最终感觉已经解决的不错了,但还不能保证某一天还会出个什么问题。

使用第三方开源组件导入及导出Excel的解决方案:

  NPOI||MyXls||Aspose.Cells==研究几年Excel。

  NPOI开源地址:http://npoi.codeplex.com/
NPOI中文文档:http://www.cnblogs.com/tonyqus/archive/2009/04/12/1434209.html

  MyXls开源地址:http://sourceforge.net/projects/myxls/

Aspose.Cells是个商业软件,下载地址:http://***/zh-CN/product/563/feature_en.aspx

下面来两个简单入门例子:
MyXls快速入门例子:

viewplaincopytoclipboardprint?

///<summary>

///MyXls简单Demo,快速入门代码

///</summary>

///<paramname="dtSource"></param>

///<paramname="strFileName"></param>

///<remarks>MyXls认为Excel的第一个单元格是:(1,1)</remarks>

///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author>

publicstaticvoidExportEasy(DataTabledtSource,stringstrFileName)

{

XlsDocumentxls=newXlsDocument();

Worksheetsheet=xls.Workbook.Worksheets.Add("Sheet1");

//填充表头

foreach(DataColumncolindtSource.Columns)

{

sheet.Cells.Add(1,col.Ordinal+1,col.ColumnName);

}

//填充内容

for(inti=0;i<dtSource.Rows.Count;i++)

{

for(intj=0;j<dtSource.Columns.Count;j++)

{

sheet.Cells.Add(i+2,j+1,dtSource.Rows[i][j].ToString());

}

}

//保存

xls.FileName=strFileName;

xls.Save();

}

///<summary> ///MyXls简单Demo,快速入门代码 ///</summary> ///<paramname="dtSource"></param> ///<paramname="strFileName"></param> ///<remarks>MyXls认为Excel的第一个单元格是:(1,1)</remarks> ///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author> publicstaticvoidExportEasy(DataTabledtSource,stringstrFileName) { XlsDocumentxls=newXlsDocument(); Worksheetsheet=xls.Workbook.Worksheets.Add("Sheet1"); //填充表头 foreach(DataColumncolindtSource.Columns) { sheet.Cells.Add(1,col.Ordinal+1,col.ColumnName); } //填充内容 for(inti=0;i<dtSource.Rows.Count;i++) { for(intj=0;j<dtSource.Columns.Count;j++) { sheet.Cells.Add(i+2,j+1,dtSource.Rows[i][j].ToString()); } } //保存 xls.FileName=strFileName; xls.Save(); }

NPOI快速入门例子:

viewplaincopytoclipboardprint?

///<summary>

///NPOI简单Demo,快速入门代码

///</summary>

///<paramname="dtSource"></param>

///<paramname="strFileName"></param>

///<remarks>NPOI认为Excel的第一个单元格是:(0,0)</remarks>

///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author>

publicstaticvoidExportEasy(DataTabledtSource,stringstrFileName)

{

HSSFWorkbookworkbook=newHSSFWorkbook();

HSSFSheetsheet=workbook.CreateSheet();

//填充表头

HSSFRowdataRow=sheet.CreateRow(0);

foreach(DataColumncolumnindtSource.Columns)

{

dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

}

//填充内容

for(inti=0;i<dtSource.Rows.Count;i++)

{

dataRow=sheet.CreateRow(i+1);

for(intj=0;j<dtSource.Columns.Count;j++)

{

dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());

}

}

//保存

using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write))

{

workbook.Write(fs);

}

workbook.Dispose();

}

///<summary> ///NPOI简单Demo,快速入门代码 ///</summary> ///<paramname="dtSource"></param> ///<paramname="strFileName"></param> ///<remarks>NPOI认为Excel的第一个单元格是:(0,0)</remarks> ///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author> publicstaticvoidExportEasy(DataTabledtSource,stringstrFileName) { HSSFWorkbookworkbook=newHSSFWorkbook(); HSSFSheetsheet=workbook.CreateSheet(); //填充表头 HSSFRowdataRow=sheet.CreateRow(0); foreach(DataColumncolumnindtSource.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); } //填充内容 for(inti=0;i<dtSource.Rows.Count;i++) { dataRow=sheet.CreateRow(i+1); for(intj=0;j<dtSource.Columns.Count;j++) { dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString()); } } //保存 using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write)) { workbook.Write(fs); } workbook.Dispose(); }

接下来是柳永法(yongfa365)'Blog封装的可以用在实际项目中的类,实现的功能有(仅NPOI):

支持web及winform从DataTable导出到Excel。

生成速度很快。

准确判断数据类型,不会出现身份证转数值等上面提到的一系列问题。

如果单页条数大于65535时会新建工作表。

列宽自适应。

支持读取Excel。

调用方便,只一调用一个静态类就OK了。

因为测试期间发现MyXls导出速度要比NPOI慢3倍,而NPOI既能满足我们的导出需求,又能很好的满足我们的导入需求,所以只针对NPOI进行全方位功能实现及优化。

MyXls导出相关类:

viewplaincopytoclipboardprint?

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingorg.in2bits.MyXls;

usingorg.in2bits.MyXls.ByteUtil;

usingSystem.Data;

classExcelHelper

{

publicstaticvoidExport(DataTabledtSource,stringstrHeaderText,stringstrFileName)

{

XlsDocumentxls=newXlsDocument();

xls.FileName=DateTime.Now.ToString("yyyyMMddHHmmssffff",System.Globalization.DateTimeFormatInfo.InvariantInfo);

xls.SummaryInformation.Author="yongfa365";//填加xls文件作者信息

xls.SummaryInformation.NameOfCreatingApplication="liuyongfa";//填加xls文件创建程序信息

xls.SummaryInformation.LastSavedBy="LastSavedBy";//填加xls文件最后保存者信息

xls.SummaryInformation.Comments="Comments";//填加xls文件作者信息

xls.SummaryInformation.Title="title";//填加xls文件标题信息

xls.SummaryInformation.Subject="Subject";//填加文件主题信息

xls.DocumentSummaryInformation.Company="company";//填加文件公司信息

Worksheetsheet=xls.Workbook.Worksheets.Add("Sheet1");//状态栏标题名称

Cellscells=sheet.Cells;

foreach(DataColumncolindtSource.Columns)

{

Cellcell=cells.Add(1,col.Ordinal+1,col.ColumnName);

cell.Font.FontFamily=FontFamilies.Roman;//字体

cell.Font.Bold=true;//字体为粗体

}

#region填充内容

XFdateStyle=xls.NewXF();

dateStyle.Format="yyyy-mm-dd";

for(inti=0;i<dtSource.Rows.Count;i++)

{

for(intj=0;j<dtSource.Columns.Count;j++)

{

introwIndex=i+2;

intcolIndex=j+1;

stringdrValue=dtSource.Rows[i][j].ToString();

switch(dtSource.Rows[i][j].GetType().ToString())

{

case"System.String"://字符串类型

cells.Add(rowIndex,colIndex,drValue);

break;

case"System.DateTime"://日期类型

DateTimedateV;

DateTime.TryParse(drValue,outdateV);

cells.Add(rowIndex,colIndex,dateV,dateStyle);

break;

case"System.Boolean"://布尔型

boolboolV=false;

bool.TryParse(drValue,outboolV);

cells.Add(rowIndex,colIndex,boolV);

break;

case"System.Int16"://整型

case"System.Int32":

case"System.Int64":

case"System.Byte":

intintV=0;

int.TryParse(drValue,outintV);

cells.Add(rowIndex,colIndex,intV);

break;

case"System.Decimal"://浮点型

case"System.Double":

doubledoubV=0;

double.TryParse(drValue,outdoubV);

cells.Add(rowIndex,colIndex,doubV);

break;

case"System.DBNull"://空值处理

cells.Add(rowIndex,colIndex,null);

break;

default:

cells.Add(rowIndex,colIndex,null);

break;

}

}

}

#endregion

xls.FileName=strFileName;

xls.Save();

}

}

usingSystem; usingSystem.Collections.Generic; usingSystem.Linq; usingSystem.Text; usingorg.in2bits.MyXls; usingorg.in2bits.MyXls.ByteUtil; usingSystem.Data; classExcelHelper { publicstaticvoidExport(DataTabledtSource,stringstrHeaderText,stringstrFileName) { XlsDocumentxls=newXlsDocument(); xls.FileName=DateTime.Now.ToString("yyyyMMddHHmmssffff",System.Globalization.DateTimeFormatInfo.InvariantInfo); xls.SummaryInformation.Author="yongfa365";//填加xls文件作者信息 xls.SummaryInformation.NameOfCreatingApplication="liuyongfa";//填加xls文件创建程序信息 xls.SummaryInformation.LastSavedBy="LastSavedBy";//填加xls文件最后保存者信息 xls.SummaryInformation.Comments="Comments";//填加xls文件作者信息 xls.SummaryInformation.Title="title";//填加xls文件标题信息 xls.SummaryInformation.Subject="Subject";//填加文件主题信息 xls.DocumentSummaryInformation.Company="company";//填加文件公司信息 Worksheetsheet=xls.Workbook.Worksheets.Add("Sheet1");//状态栏标题名称 Cellscells=sheet.Cells; foreach(DataColumncolindtSource.Columns) { Cellcell=cells.Add(1,col.Ordinal+1,col.ColumnName); cell.Font.FontFamily=FontFamilies.Roman;//字体 cell.Font.Bold=true;//字体为粗体 } #region填充内容 XFdateStyle=xls.NewXF(); dateStyle.Format="yyyy-mm-dd"; for(inti=0;i<dtSource.Rows.Count;i++) { for(intj=0;j<dtSource.Columns.Count;j++) { introwIndex=i+2; intcolIndex=j+1; stringdrValue=dtSource.Rows[i][j].ToString(); switch(dtSource.Rows[i][j].GetType().ToString()) { case"System.String"://字符串类型 cells.Add(rowIndex,colIndex,drValue); break; case"System.DateTime"://日期类型 DateTimedateV; DateTime.TryParse(drValue,outdateV); cells.Add(rowIndex,colIndex,dateV,dateStyle); break; case"System.Boolean"://布尔型 boolboolV=false; bool.TryParse(drValue,outboolV); cells.Add(rowIndex,colIndex,boolV); break; case"System.Int16"://整型 case"System.Int32": case"System.Int64": case"System.Byte": intintV=0; int.TryParse(drValue,outintV); cells.Add(rowIndex,colIndex,intV); break; case"System.Decimal"://浮点型 case"System.Double": doubledoubV=0; double.TryParse(drValue,outdoubV); cells.Add(rowIndex,colIndex,doubV); break; case"System.DBNull"://空值处理 cells.Add(rowIndex,colIndex,null); break; default: cells.Add(rowIndex,colIndex,null); break; } } } #endregion xls.FileName=strFileName; xls.Save(); } }

NPOI导入导出相关类:

viewplaincopytoclipboardprint?

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Data;

usingSystem.IO;

usingSystem.Text;

usingSystem.Web;

usingNPOI;

usingNPOI.HPSF;

usingNPOI.HSSF;

usingNPOI.HSSF.UserModel;

usingNPOI.HSSF.Util;

usingNPOI.POIFS;

usingNPOI.Util;

publicclassExcelHelper

{

///<summary>

///DataTable导出到Excel文件

///</summary>

///<paramname="dtSource">源DataTable</param>

///<paramname="strHeaderText">表头文本</param>

///<paramname="strFileName">保存位置</param>

///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author>

publicstaticvoidExport(DataTabledtSource,stringstrHeaderText,stringstrFileName)

{

using(MemoryStreamms=Export(dtSource,strHeaderText))

{

using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write))

{

byte[]data=ms.ToArray();

fs.Write(data,0,data.Length);

fs.Flush();

}

}

}

///<summary>

///DataTable导出到Excel的MemoryStream

///</summary>

///<paramname="dtSource">源DataTable</param>

///<paramname="strHeaderText">表头文本</param>

///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author>

publicstaticMemoryStreamExport(DataTabledtSource,stringstrHeaderText)

{

HSSFWorkbookworkbook=newHSSFWorkbook();

HSSFSheetsheet=workbook.CreateSheet();

#region右击文件属性信息

{

DocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation();

dsi.Company="http://www.yongfa365.com/";

workbook.DocumentSummaryInformation=dsi;

SummaryInformationsi=PropertySetFactory.CreateSummaryInformation();

si.Author="柳永法";//填加xls文件作者信息

si.ApplicationName="NPOI测试程序";//填加xls文件创建程序信息

si.LastAuthor="柳永法2";//填加xls文件最后保存者信息

si.Comments="说明信息";//填加xls文件作者信息

si.Title="NPOI测试";//填加xls文件标题信息

si.Subject="NPOI测试Demo";//填加文件主题信息

si.CreateDateTime=DateTime.Now;

workbook.SummaryInformation=si;

}

#endregion

HSSFCellStyledateStyle=workbook.CreateCellStyle();

HSSFDataFormatformat=workbook.CreateDataFormat();

dateStyle.DataFormat=format.GetFormat("yyyy-mm-dd");

//取得列宽

int[]arrColWidth=newint[dtSource.Columns.Count];

foreach(DataColumnitemindtSource.Columns)

{

arrColWidth[item.Ordinal]=Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;

}

for(inti=0;i<dtSource.Rows.Count;i++)

{

for(intj=0;j<dtSource.Columns.Count;j++)

{

intintTemp=Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;

if(intTemp>arrColWidth[j])

{

arrColWidth[j]=intTemp;

}

}

}

introwIndex=0;

foreach(DataRowrowindtSource.Rows)

{

#region新建表,填充表头,填充列头,样式

if(rowIndex==65535||rowIndex==0)

{

if(rowIndex!=0)

{

sheet=workbook.CreateSheet();

}

#region表头及样式

{

HSSFRowheaderRow=sheet.CreateRow(0);

headerRow.HeightInPoints=25;

headerRow.CreateCell(0).SetCellValue(strHeaderText);

HSSFCellStyleheadStyle=workbook.CreateCellStyle();

headStyle.Alignment=CellHorizontalAlignment.CENTER;

HSSFFontfont=workbook.CreateFont();

font.FontHeightInPoints=20;

font.Boldweight=700;

headStyle.SetFont(font);

headerRow.GetCell(0).CellStyle=headStyle;

sheet.AddMergedRegion(newRegion(0,0,0,dtSource.Columns.Count-1));

headerRow.Dispose();

}

#endregion

#region列头及样式

{

HSSFRowheaderRow=sheet.CreateRow(1);

HSSFCellStyleheadStyle=workbook.CreateCellStyle();

headStyle.Alignment=CellHorizontalAlignment.CENTER;

HSSFFontfont=workbook.CreateFont();

font.FontHeightInPoints=10;

font.Boldweight=700;

headStyle.SetFont(font);

foreach(DataColumncolumnindtSource.Columns)

{

headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);

headerRow.GetCell(column.Ordinal).CellStyle=headStyle;

//设置列宽

sheet.SetColumnWidth(column.Ordinal,(arrColWidth[column.Ordinal]+1)*256);

}

headerRow.Dispose();

}

#endregion

rowIndex=2;

}

#endregion

#region填充内容

HSSFRowdataRow=sheet.CreateRow(rowIndex);

foreach(DataColumncolumnindtSource.Columns)

{

HSSFCellnewCell=dataRow.CreateCell(column.Ordinal);

stringdrValue=row[column].ToString();

switch(column.DataType.ToString())

{

case"System.String"://字符串类型

newCell.SetCellValue(drValue);

break;

case"System.DateTime"://日期类型

DateTimedateV;

DateTime.TryParse(drValue,outdateV);

newCell.SetCellValue(dateV);

newCell.CellStyle=dateStyle;//格式化显示

break;

case"System.Boolean"://布尔型

boolboolV=false;

bool.TryParse(drValue,outboolV);

newCell.SetCellValue(boolV);

break;

case"System.Int16"://整型

case"System.Int32":

case"System.Int64":

case"System.Byte":

intintV=0;

int.TryParse(drValue,outintV);

newCell.SetCellValue(intV);

break;

case"System.Decimal"://浮点型

case"System.Double":

doubledoubV=0;

double.TryParse(drValue,outdoubV);

newCell.SetCellValue(doubV);

break;

case"System.DBNull"://空值处理

newCell.SetCellValue("");

break;

default:

newCell.SetCellValue("");

break;

}

}

#endregion

rowIndex++;

}

using(MemoryStreamms=newMemoryStream())

{

workbook.Write(ms);

ms.Flush();

ms.Position=0;

sheet.Dispose();

//workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet

returnms;

}

}

///<summary>

///用于Web导出

///</summary>

///<paramname="dtSource">源DataTable</param>

///<paramname="strHeaderText">表头文本</param>

///<paramname="strFileName">文件名</param>

///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author>

publicstaticvoidExportByWeb(DataTabledtSource,stringstrHeaderText,stringstrFileName)

{

HttpContextcurContext=HttpContext.Current;

//设置编码和附件格式

curContext.Response.ContentType="application/vnd.ms-excel";

curContext.Response.ContentEncoding=Encoding.UTF8;

curContext.Response.Charset="";

curContext.Response.AppendHeader("Content-Disposition",

"attachment;filename="+HttpUtility.UrlEncode(strFileName,Encoding.UTF8));

curContext.Response.BinaryWrite(Export(dtSource,strHeaderText).GetBuffer());

curContext.Response.End();

}

///<summary>读取excel

///默认第一行为标头

///</summary>

///<paramname="strFileName">excel文档路径</param>

///<returns></returns>

publicstaticDataTableImport(stringstrFileName)

{

DataTabledt=newDataTable();

HSSFWorkbookhssfworkbook;

using(FileStreamfile=newFileStream(strFileName,FileMode.Open,FileAccess.Read))

{

hssfworkbook=newHSSFWorkbook(file);

}

HSSFSheetsheet=hssfworkbook.GetSheetAt(0);

System.Collections.IEnumeratorrows=sheet.GetRowEnumerator();

HSSFRowheaderRow=sheet.GetRow(0);

intcellCount=headerRow.LastCellNum;

for(intj=0;j<cellCount;j++)

{

HSSFCellcell=headerRow.GetCell(j);

dt.Columns.Add(cell.ToString());

}

for(inti=(sheet.FirstRowNum+1);i<=sheet.LastRowNum;i++)

{

HSSFRowrow=sheet.GetRow(i);

DataRowdataRow=dt.NewRow();

for(intj=row.FirstCellNum;j<cellCount;j++)

{

if(row.GetCell(j)!=null)

dataRow[j]=row.GetCell(j).ToString();

}

dt.Rows.Add(dataRow);

}

returndt;

}

}

usingSystem; usingSystem.Collections.Generic; usingSystem.Data; usingSystem.IO; usingSystem.Text; usingSystem.Web; usingNPOI; usingNPOI.HPSF; usingNPOI.HSSF; usingNPOI.HSSF.UserModel; usingNPOI.HSSF.Util; usingNPOI.POIFS; usingNPOI.Util; publicclassExcelHelper { ///<summary> ///DataTable导出到Excel文件 ///</summary> ///<paramname="dtSource">源DataTable</param> ///<paramname="strHeaderText">表头文本</param> ///<paramname="strFileName">保存位置</param> ///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author> publicstaticvoidExport(DataTabledtSource,stringstrHeaderText,stringstrFileName) { using(MemoryStreamms=Export(dtSource,strHeaderText)) { using(FileStreamfs=newFileStream(strFileName,FileMode.Create,FileAccess.Write)) { byte[]data=ms.ToArray(); fs.Write(data,0,data.Length); fs.Flush(); } } } ///<summary> ///DataTable导出到Excel的MemoryStream ///</summary> ///<paramname="dtSource">源DataTable</param> ///<paramname="strHeaderText">表头文本</param> ///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author> publicstaticMemoryStreamExport(DataTabledtSource,stringstrHeaderText) { HSSFWorkbookworkbook=newHSSFWorkbook(); HSSFSheetsheet=workbook.CreateSheet(); #region右击文件属性信息 { DocumentSummaryInformationdsi=PropertySetFactory.CreateDocumentSummaryInformation(); dsi.Company="http://www.yongfa365.com/"; workbook.DocumentSummaryInformation=dsi; SummaryInformationsi=PropertySetFactory.CreateSummaryInformation(); si.Author="柳永法";//填加xls文件作者信息 si.ApplicationName="NPOI测试程序";//填加xls文件创建程序信息 si.LastAuthor="柳永法2";//填加xls文件最后保存者信息 si.Comments="说明信息";//填加xls文件作者信息 si.Title="NPOI测试";//填加xls文件标题信息 si.Subject="NPOI测试Demo";//填加文件主题信息 si.CreateDateTime=DateTime.Now; workbook.SummaryInformation=si; } #endregion HSSFCellStyledateStyle=workbook.CreateCellStyle(); HSSFDataFormatformat=workbook.CreateDataFormat(); dateStyle.DataFormat=format.GetFormat("yyyy-mm-dd"); //取得列宽 int[]arrColWidth=newint[dtSource.Columns.Count]; foreach(DataColumnitemindtSource.Columns) { arrColWidth[item.Ordinal]=Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length; } for(inti=0;i<dtSource.Rows.Count;i++) { for(intj=0;j<dtSource.Columns.Count;j++) { intintTemp=Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length; if(intTemp>arrColWidth[j]) { arrColWidth[j]=intTemp; } } } introwIndex=0; foreach(DataRowrowindtSource.Rows) { #region新建表,填充表头,填充列头,样式 if(rowIndex==65535||rowIndex==0) { if(rowIndex!=0) { sheet=workbook.CreateSheet(); } #region表头及样式 { HSSFRowheaderRow=sheet.CreateRow(0); headerRow.HeightInPoints=25; headerRow.CreateCell(0).SetCellValue(strHeaderText); HSSFCellStyleheadStyle=workbook.CreateCellStyle(); headStyle.Alignment=CellHorizontalAlignment.CENTER; HSSFFontfont=workbook.CreateFont(); font.FontHeightInPoints=20; font.Boldweight=700; headStyle.SetFont(font); headerRow.GetCell(0).CellStyle=headStyle; sheet.AddMergedRegion(newRegion(0,0,0,dtSource.Columns.Count-1)); headerRow.Dispose(); } #endregion #region列头及样式 { HSSFRowheaderRow=sheet.CreateRow(1); HSSFCellStyleheadStyle=workbook.CreateCellStyle(); headStyle.Alignment=CellHorizontalAlignment.CENTER; HSSFFontfont=workbook.CreateFont(); font.FontHeightInPoints=10; font.Boldweight=700; headStyle.SetFont(font); foreach(DataColumncolumnindtSource.Columns) { headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName); headerRow.GetCell(column.Ordinal).CellStyle=headStyle; //设置列宽 sheet.SetColumnWidth(column.Ordinal,(arrColWidth[column.Ordinal]+1)*256); } headerRow.Dispose(); } #endregion rowIndex=2; } #endregion #region填充内容 HSSFRowdataRow=sheet.CreateRow(rowIndex); foreach(DataColumncolumnindtSource.Columns) { HSSFCellnewCell=dataRow.CreateCell(column.Ordinal); stringdrValue=row[column].ToString(); switch(column.DataType.ToString()) { case"System.String"://字符串类型 newCell.SetCellValue(drValue); break; case"System.DateTime"://日期类型 DateTimedateV; DateTime.TryParse(drValue,outdateV); newCell.SetCellValue(dateV); newCell.CellStyle=dateStyle;//格式化显示 break; case"System.Boolean"://布尔型 boolboolV=false; bool.TryParse(drValue,outboolV); newCell.SetCellValue(boolV); break; case"System.Int16"://整型 case"System.Int32": case"System.Int64": case"System.Byte": intintV=0; int.TryParse(drValue,outintV); newCell.SetCellValue(intV); break; case"System.Decimal"://浮点型 case"System.Double": doubledoubV=0; double.TryParse(drValue,outdoubV); newCell.SetCellValue(doubV); break; case"System.DBNull"://空值处理 newCell.SetCellValue(""); break; default: newCell.SetCellValue(""); break; } } #endregion rowIndex++; } using(MemoryStreamms=newMemoryStream()) { workbook.Write(ms); ms.Flush(); ms.Position=0; sheet.Dispose(); //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet returnms; } } ///<summary> ///用于Web导出 ///</summary> ///<paramname="dtSource">源DataTable</param> ///<paramname="strHeaderText">表头文本</param> ///<paramname="strFileName">文件名</param> ///<Author>柳永法http://www.yongfa365.com/2010-5-822:21:41</Author> publicstaticvoidExportByWeb(DataTabledtSource,stringstrHeaderText,stringstrFileName) { HttpContextcurContext=HttpContext.Current; //设置编码和附件格式 curContext.Response.ContentType="application/vnd.ms-excel"; curContext.Response.ContentEncoding=Encoding.UTF8; curContext.Response.Charset=""; curContext.Response.AppendHeader("Content-Disposition", "attachment;filename="+HttpUtility.UrlEncode(strFileName,Encoding.UTF8)); curContext.Response.BinaryWrite(Export(dtSource,strHeaderText).GetBuffer()); curContext.Response.End(); } ///<summary>读取excel ///默认第一行为标头 ///</summary> ///<paramname="strFileName">excel文档路径</param> ///<returns></returns> publicstaticDataTableImport(stringstrFileName) { DataTabledt=newDataTable(); HSSFWorkbookhssfworkbook; using(FileStreamfile=newFileStream(strFileName,FileMode.Open,FileAccess.Read)) { hssfworkbook=newHSSFWorkbook(file); } HSSFSheetsheet=hssfworkbook.GetSheetAt(0); System.Collections.IEnumeratorrows=sheet.GetRowEnumerator(); HSSFRowheaderRow=sheet.GetRow(0); intcellCount=headerRow.LastCellNum; for(intj=0;j<cellCount;j++) { HSSFCellcell=headerRow.GetCell(j); dt.Columns.Add(cell.ToString()); } for(inti=(sheet.FirstRowNum+1);i<=sheet.LastRowNum;i++) { HSSFRowrow=sheet.GetRow(i); DataRowdataRow=dt.NewRow(); for(intj=row.FirstCellNum;j<cellCount;j++) { if(row.GetCell(j)!=null) dataRow[j]=row.GetCell(j).ToString(); } dt.Rows.Add(dataRow); } returndt; } }
Aspose.Cells使用整理


以上

这两天用Aspose.Cells构建一个Excel报表,感觉这个组件还比较好用.记录一下常用的使用知识:这两天用Aspose.Cells构建一个Excel报表,感觉这个组件还比较好用.记录一下常用的使用知识:

1.创建Workbook和Worksheet

workbook&worksheet1
Workbookwb=newWorkbook();
wb.Worksheets.Clear();
wb.Worksheets.Add("NewWorksheet1");//NewWorksheet1是Worksheet的name
Worksheetws=wb.Worksheets[0];
如果直接用下边两句则直接使用默认的第一个Worksheet:

workbook&worksheet2
Workbookwb=newWorkbook();
Worksheetws=wb.Worksheets[0];
2.给Cell赋值设置背景颜色并加背景色:

cell1
Cellcell=ws.Cells[0,0];
cell.PutValue("填充");//必须用PutValue方法赋值
cell.Style.ForegroundColor=Color.Yellow;
cell.Style.Pattern=BackgroundType.Solid;
cell.Style.Font.Size=10;
cell.Style.Font.Color=Color.Blue;
自定义格式:

cell2
cell.Style.Custom="ddd,ddmmmm'yy";
旋转字体:

cell3
cell.Style.Rotation=90;
3.设置Range并赋值加Style

range1
intstyleIndex=wb.Styles.Add();
Stylestyle=wb.Styles[styleIndex];
style.ForegroundColor=Color.Yellow;
style.Pattern=BackgroundType.Solid;
style.Font.Size=10;

//从Cells[0,0]开始创建一个2行3列的Range
Rangerange=ws.Cells.CreateRange(0,0,2,3);
Cellcell=range[0,0];
cell.Style.Font=9;
range.Style=style;
range.Merge();
注意Range不能直接设置Style.必须先定义style再将style赋给Style.其他设置和Cell基本一致.Range的Style会覆盖Cell定义的Style.另外必须先赋值再传Style.否则可能不生效.

4.使用Formula:

formula1
ws.Cells[0,0].PutValue(1);
ws.Cells[1,0].PutValue(20);
ws.Cells[2,0].Formula="SUM(A1:B1)";
wb.CalculateFormula(true);
SaveExcel文件的时候必须调用CalculateFormula方法计算结果.

5.插入图片:

pictures1
stringimageUrl=System.Web.HttpContext.Current.Server.MapPath("~/images/log_topleft.gif");
ws.Pictures.Add(10,10,imageUrl);

6.使用Validations:

validations1
Cellscells=ws.Cells;

cells[12,0].PutValue("Pleaseenteranumberotherthan0to10inB1toactivatedatavalidation:");
cells[12,0].Style.IsTextWrapped=true;

cells[12,1].PutValue(5);
Validationsvalidations=totalSheet.Validations;

Validationvalidation=validations[validations.Add()];
//Setthedatavalidationtype
validation.Type=ValidationType.WholeNumber;
//Settheoperatorforthedatavalidation
validation.Operator=OperatorType.Between;
//Setthevalueorexpressionassociatedwiththedatavalidation
validation.Formula1="0";
//thevalueorexpressionassociatedwiththesecondpartofthedatavalidation
validation.Formula2="10";

validation.ShowError=true;
//Setthevalidationalertstyle
validation.AlertStyle=ValidationAlertType.Information;
//Setthetitleofthedata-validationerrordialogbox
validation.ErrorTitle="Error";
//Setthedatavalidationerrormessage
validation.ErrorMessage="Entervaluebetween0to10";
//Setthedatavalidationinputmessage
validation.InputMessage="DataValidationusingConditionforNumbers";
validation.IgnoreBlank=true;
validation.ShowInput=true;
validation.ShowError=true;

//设置Validations的区域,因为现在要Validations的位置是12,1,所以下面设置对应的也要是12,1
CellAreacellArea;
cellArea.StartRow=12;
cellArea.EndRow=12;
cellArea.StartColumn=1;
cellArea.EndColumn=1;
validation.AreaList.Add(cellArea);

/*
要注意的地方Validations也是和Range的Style一样,要新增的,否则不生效
*/

相关源码及测试用例下载地址:

http://download.csdn.net/source/2330821

参考地址:

NPOI导出Excel表功能实现(多个工作簿):/article/6313097.html
在Server端存取Excel檔案的利器:NPOILibrary:http://msdn.microsoft.com/zh-tw/ee818993.aspx
ASP.NET使用NPOI类库导出Excel:/article/4973794.html

总结:

  通过以上分析,我们不难发现,用NPOI或MyXls代替是Excel是很明智的,在发文前,我看到NPOI及MyXls仍然在活跃的更新中。在使用过程中发现这两个组件极相似,以前看过文章说他们使用的内核是一样的。还有NPOI是国人开发的,且有相关中文文档,在很多地方有相关引用,下载量也很大。并且它支持Excel,看到MyXls相关问题基本上没人回答,所以推荐使用NPOI。MyXls可以直接Cell.Font.Bold操作,而NPOI得使用CellType多少感觉有点麻烦。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: