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开源地址:
NPOI中文文档:
MyXls开源地址:
Aspose.Cells是个商业软件,下载地址:
下面来两个简单入门例子:
MyXls快速入门例子:
///<summary>
///MyXls简单Demo,快速入门代码
///</summary>
///<paramname="dtSource"></param>
///<paramname="strFileName"></param>
///<remarks>MyXls认为Excel的第一个单元格是:(1,1)</remarks>
///<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快速入门例子:
///<summary>
///NPOI简单Demo,快速入门代码
///</summary>
///<paramname="dtSource"></param>
///<paramname="strFileName"></param>
///<remarks>NPOI认为Excel的第一个单元格是:(0,0)</remarks>
///<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();
}
接下来是
支持web及winform从DataTable导出到Excel。
生成速度很快。
准确判断数据类型,不会出现身份证转数值等上面提到的一系列问题。
如果单页条数大于65535时会新建工作表。
列宽自适应。
支持读取Excel。
调用方便,只一调用一个静态类就OK了。
因为测试期间发现MyXls导出速度要比NPOI慢3倍,而NPOI既能满足我们的导出需求,又能很好的满足我们的导入需求,所以只针对NPOI进行全方位功能实现及优化。
MyXls导出相关类:
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导入导出相关类:
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>柳永法
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>柳永法
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>柳永法
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构建一个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一样,要新增的,否则不生效
*/
相关源码及测试用例下载地址:
参考地址:
NPOI导出Excel表功能实现(多个工作簿):在Server端存取Excel檔案的利器:NPOILibrary:
ASP.NET使用NPOI类库导出Excel:
总结:
通过以上分析,我们不难发现,用NPOI或MyXls代替是Excel是很明智的,在发文前,我看到NPOI及MyXls仍然在活跃的更新中。在使用过程中发现这两个组件极相似,以前看过文章说他们使用的内核是一样的。还有NPOI是国人开发的,且有相关中文文档,在很多地方有相关引用,下载量也很大。并且它支持Excel,看到MyXls相关问题基本上没人回答,所以推荐使用NPOI。MyXls可以直接Cell.Font.Bold操作,而NPOI得使用CellType多少感觉有点麻烦。相关文章推荐
- NPOI、MyXls、Aspose.Cells 导入导出Excel(转)
- Aspose.Cells、NPOI、MyXls导出Excel
- C# 基于Aspose.Cells的数据导出到Excel
- NPOI 导入导出excel 支持 03 07
- 使用NPOI导入导出标准的Excel
- Asp.net程序中用NPOI生成标准Excel报表,导入导出一应俱全[转]
- 使用NPOI导入导出标准Excel
- NPOI-WebForm_Excel导入与导出
- NPOI 2.1.1 系列(1) 使用NPOI读取 Excel文档 ;NpoiExcelHelper 导入导出 2003格式 2007格式的 Excel; Npoi 导出 xlsx 格式
- 使用NPOI导入导出标准Excel
- C# winform 导出导入Excel/Doc 完整实例教程 使用Aspose.Cells.dll——第二篇
- Excel操作--使用NPOI导入导出Excel为DataTable
- asp.net Mvc Npoi 导出导入 excel
- asp.net(NPOI)导入导出excel表
- .net 使用NPOI或MyXls把DataTable导出到Excel
- 使用NPOI导入导出标准Excel
- 使用NPOI导入导出标准Excel
- winfrom 使用NPOI导入导出Excel(xls/xlsx)数据到DataTable中
- 使用NPOI操作Excel导入导出数据
- C# winform 导出导入Excel/Doc 完整实例教程 使用Aspose.Cells.dll——第一篇