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

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 快速入门例子:

 
/// <summary> 

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

/// </summary> 

/// <param name="dtSource"></param> 

/// <param name="strFileName"></param> 

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

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

publicstaticvoid ExportEasy(DataTable dtSource, string strFileName) 

{ 

XlsDocument xls = new XlsDocument(); 

Worksheet sheet = xls.Workbook.Worksheets.Add("Sheet1"); 



//填充表头 

foreach (DataColumn col in dtSource.Columns) 

{ 

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

} 



//填充内容 

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

{ 

for (int j = 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>

/// <param name="dtSource"></param>

/// <param name="strFileName"></param>

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

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

public static void ExportEasy(DataTable dtSource,  string strFileName)

{

    XlsDocument xls = new XlsDocument();

    Worksheet sheet = xls.Workbook.Worksheets.Add("Sheet1");



    //填充表头

    foreach (DataColumn col in dtSource.Columns)

    {

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

    }



    //填充内容

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

    {

        for (int j = 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> 

/// <param name="dtSource"></param> 

/// <param name="strFileName"></param> 

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

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

publicstaticvoid ExportEasy(DataTable dtSource, string strFileName) 

{ 

HSSFWorkbook workbook = new HSSFWorkbook(); 

HSSFSheet sheet = workbook.CreateSheet(); 



//填充表头 

HSSFRow dataRow = sheet.CreateRow(0); 

foreach (DataColumn column in dtSource.Columns) 

{ 

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

} 





//填充内容 

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

{ 

dataRow = sheet.CreateRow(i + 1); 

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

{ 

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

} 

} 





//保存 

using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) 

{ 

workbook.Write(fs); 

} 

workbook.Dispose(); 

} 

 
   

 


/// <summary>

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

/// </summary>

/// <param name="dtSource"></param>

/// <param name="strFileName"></param>

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

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

public static void ExportEasy(DataTable dtSource, string strFileName)

{

    HSSFWorkbook workbook = new HSSFWorkbook();

    HSSFSheet sheet = workbook.CreateSheet();



    //填充表头

    HSSFRow dataRow = sheet.CreateRow(0);

    foreach (DataColumn column in dtSource.Columns)

    {

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

    }





    //填充内容

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

    {

        dataRow = sheet.CreateRow(i + 1);

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

        {

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

        }

    }





    //保存

    using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))

    {

        workbook.Write(fs);

    }

    workbook.Dispose();

}

 

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

  1. 支持web及winform从DataTable导出到Excel。
  2. 生成速度很快。
  3. 准确判断数据类型,不会出现身份证转数值等上面提到的一系列问题。
  4. 如果单页条数大于65535时会新建工作表。
  5. 列宽自适应。
  6. 支持读取Excel。
  7. 调用方便,只一调用一个静态类就OK了。

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

MyXls导出相关类:

using System; 

using System.Collections.Generic; 

using System.Linq; 

using System.Text; 

using org.in2bits.MyXls; 

using org.in2bits.MyXls.ByteUtil; 

using System.Data; 



class ExcelHelper 

{ 

publicstaticvoid Export(DataTable dtSource, string strHeaderText, string strFileName) 

{ 

XlsDocument xls = new XlsDocument(); 

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

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

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

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

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

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

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

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





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

Cells cells = sheet.Cells; 



foreach (DataColumn col in dtSource.Columns) 

{ 

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

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

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



} 

#region 填充内容 

XF dateStyle = xls.NewXF(); 

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



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

{ 

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

{ 



int rowIndex = i + 2; 

int colIndex = j + 1; 

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



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

{ 

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

cells.Add(rowIndex, colIndex, drValue); 

break; 

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

DateTime dateV; 

DateTime.TryParse(drValue, out dateV); 

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

break; 

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

bool boolV = false; 

bool.TryParse(drValue, out boolV); 

cells.Add(rowIndex, colIndex, boolV); 

break; 

case"System.Int16"://整型 

case"System.Int32": 

case"System.Int64": 

case"System.Byte": 

int intV = 0; 

int.TryParse(drValue, out intV); 

cells.Add(rowIndex, colIndex, intV); 

break; 

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

case"System.Double": 

double doubV = 0; 

double.TryParse(drValue, out doubV); 

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(); 

} 

} 

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using org.in2bits.MyXls;

using org.in2bits.MyXls.ByteUtil;

using System.Data;



class ExcelHelper

{

    public static void Export(DataTable dtSource, string strHeaderText, string strFileName)

    {

        XlsDocument xls = new XlsDocument();

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

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

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

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

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

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

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

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





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

        Cells cells = sheet.Cells;



        foreach (DataColumn col in dtSource.Columns)

        {

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

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

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



        }

        #region 填充内容

        XF dateStyle = xls.NewXF();

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



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

        {

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

            {



                int rowIndex = i + 2;

                int colIndex = j + 1;

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



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

                {

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

                        cells.Add(rowIndex, colIndex, drValue);

                        break;

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

                        DateTime dateV;

                        DateTime.TryParse(drValue, out dateV);

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

                        break;

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

                        bool boolV = false;

                        bool.TryParse(drValue, out boolV);

                        cells.Add(rowIndex, colIndex, boolV);

                        break;

                    case "System.Int16"://整型

                    case "System.Int32":

                    case "System.Int64":

                    case "System.Byte":

                        int intV = 0;

                        int.TryParse(drValue, out intV);

                        cells.Add(rowIndex, colIndex, intV);

                        break;

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

                    case "System.Double":

                        double doubV = 0;

                        double.TryParse(drValue, out doubV);

                        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导入导出相关类:

        
using System; 

using System.Collections.Generic; 

using System.Data; 

using System.IO; 

using System.Text; 

using System.Web; 

using NPOI; 

using NPOI.HPSF; 

using NPOI.HSSF; 

using NPOI.HSSF.UserModel; 

using NPOI.HSSF.Util; 

using NPOI.POIFS; 

using NPOI.Util; 





publicclass ExcelHelper 

{ 

/// <summary> 

/// DataTable导出到Excel文件 

/// </summary> 

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

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

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

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

publicstaticvoid Export(DataTable dtSource, string strHeaderText, string strFileName) 

{ 

using (MemoryStream ms = Export(dtSource, strHeaderText)) 

{ 

using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) 

{ 

byte[] data = ms.ToArray(); 

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

fs.Flush(); 

} 

} 

} 



/// <summary> 

/// DataTable导出到Excel的MemoryStream 

/// </summary> 

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

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

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

publicstatic MemoryStream Export(DataTable dtSource, string strHeaderText) 

{ 

HSSFWorkbook workbook = new HSSFWorkbook(); 

HSSFSheet sheet = workbook.CreateSheet(); 



#region 右击文件 属性信息 

{ 

DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation(); 

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

workbook.DocumentSummaryInformation = dsi; 



SummaryInformation si = 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 



HSSFCellStyle dateStyle = workbook.CreateCellStyle(); 

HSSFDataFormat format = workbook.CreateDataFormat(); 

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



//取得列宽 

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

foreach (DataColumn item in dtSource.Columns) 

{ 

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

} 

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

{ 

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

{ 

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

if (intTemp > arrColWidth[j]) 

{ 

arrColWidth[j] = intTemp; 

} 

} 

} 







int rowIndex = 0; 



foreach (DataRow row in dtSource.Rows) 

{ 

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

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

{ 

if (rowIndex != 0) 

{ 

sheet = workbook.CreateSheet(); 

} 



#region 表头及样式 

{ 

HSSFRow headerRow = sheet.CreateRow(0); 

headerRow.HeightInPoints = 25; 

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



HSSFCellStyle headStyle = workbook.CreateCellStyle(); 

headStyle.Alignment = CellHorizontalAlignment.CENTER; 

HSSFFont font = workbook.CreateFont(); 

font.FontHeightInPoints = 20; 

font.Boldweight = 700; 

headStyle.SetFont(font); 



headerRow.GetCell(0).CellStyle = headStyle; 



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

headerRow.Dispose(); 

} 

#endregion 





#region 列头及样式 

{ 

HSSFRow headerRow = sheet.CreateRow(1); 





HSSFCellStyle headStyle = workbook.CreateCellStyle(); 

headStyle.Alignment = CellHorizontalAlignment.CENTER; 

HSSFFont font = workbook.CreateFont(); 

font.FontHeightInPoints = 10; 

font.Boldweight = 700; 

headStyle.SetFont(font); 





foreach (DataColumn column in dtSource.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 填充内容 

HSSFRow dataRow = sheet.CreateRow(rowIndex); 

foreach (DataColumn column in dtSource.Columns) 

{ 

HSSFCell newCell = dataRow.CreateCell(column.Ordinal); 



string drValue = row[column].ToString(); 



switch (column.DataType.ToString()) 

{ 

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

newCell.SetCellValue(drValue); 

break; 

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

DateTime dateV; 

DateTime.TryParse(drValue, out dateV); 

newCell.SetCellValue(dateV); 



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

break; 

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

bool boolV = false; 

bool.TryParse(drValue, out boolV); 

newCell.SetCellValue(boolV); 

break; 

case"System.Int16"://整型 

case"System.Int32": 

case"System.Int64": 

case"System.Byte": 

int intV = 0; 

int.TryParse(drValue, out intV); 

newCell.SetCellValue(intV); 

break; 

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

case"System.Double": 

double doubV = 0; 

double.TryParse(drValue, out doubV); 

newCell.SetCellValue(doubV); 

break; 

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

newCell.SetCellValue(""); 

break; 

default: 

newCell.SetCellValue(""); 

break; 

} 



} 

#endregion 



rowIndex++; 

} 





using (MemoryStream ms = new MemoryStream()) 

{ 

workbook.Write(ms); 

ms.Flush(); 

ms.Position = 0; 



sheet.Dispose(); 

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

return ms; 

} 



} 





/// <summary> 

/// 用于Web导出 

/// </summary> 

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

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

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

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

publicstaticvoid ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName) 

{ 



HttpContext curContext = 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> 

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

/// <returns></returns> 

publicstatic DataTable Import(string strFileName) 

{ 

DataTable dt = new DataTable(); 



HSSFWorkbook hssfworkbook; 

using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read)) 

{ 

hssfworkbook = new HSSFWorkbook(file); 

} 

HSSFSheet sheet = hssfworkbook.GetSheetAt(0); 

System.Collections.IEnumerator rows = sheet.GetRowEnumerator(); 



HSSFRow headerRow = sheet.GetRow(0); 

int cellCount = headerRow.LastCellNum; 



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

{ 

HSSFCell cell = headerRow.GetCell(j); 

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

} 



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

{ 

HSSFRow row = sheet.GetRow(i); 

DataRow dataRow = dt.NewRow(); 



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

{ 

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

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

} 



dt.Rows.Add(dataRow); 

} 

return dt; 

} 



} 

 

using System;

using System.Collections.Generic;

using System.Data;

using System.IO;

using System.Text;

using System.Web;

using NPOI;

using NPOI.HPSF;

using NPOI.HSSF;

using NPOI.HSSF.UserModel;

using NPOI.HSSF.Util;

using NPOI.POIFS;

using NPOI.Util;





public class ExcelHelper

{

    /// <summary>

    /// DataTable导出到Excel文件

    /// </summary>

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

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

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

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

    public static void Export(DataTable dtSource, string strHeaderText, string strFileName)

    {

        using (MemoryStream ms = Export(dtSource, strHeaderText))

        {

            using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))

            {

                byte[] data = ms.ToArray();

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

                fs.Flush();

            }

        }

    }



    /// <summary>

    /// DataTable导出到Excel的MemoryStream

    /// </summary>

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

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

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

    public static MemoryStream Export(DataTable dtSource, string strHeaderText)

    {

        HSSFWorkbook workbook = new HSSFWorkbook();

        HSSFSheet sheet = workbook.CreateSheet();



        #region 右击文件 属性信息

        {

            DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();

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

            workbook.DocumentSummaryInformation = dsi;



            SummaryInformation si = 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



        HSSFCellStyle dateStyle = workbook.CreateCellStyle();

        HSSFDataFormat format = workbook.CreateDataFormat();

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



        //取得列宽

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

        foreach (DataColumn item in dtSource.Columns)

        {

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

        }

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

        {

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

            {

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

                if (intTemp > arrColWidth[j])

                {

                    arrColWidth[j] = intTemp;

                }

            }

        }







        int rowIndex = 0;



        foreach (DataRow row in dtSource.Rows)

        {

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

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

            {

                if (rowIndex != 0)

                {

                    sheet = workbook.CreateSheet();

                }



                #region 表头及样式

                {

                    HSSFRow headerRow = sheet.CreateRow(0);

                    headerRow.HeightInPoints = 25;

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



                    HSSFCellStyle headStyle = workbook.CreateCellStyle();

                    headStyle.Alignment = CellHorizontalAlignment.CENTER;

                    HSSFFont font = workbook.CreateFont();

                    font.FontHeightInPoints = 20;

                    font.Boldweight = 700;

                    headStyle.SetFont(font);



                    headerRow.GetCell(0).CellStyle = headStyle;



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

                    headerRow.Dispose();

                }

                #endregion





                #region 列头及样式

                {

                    HSSFRow headerRow = sheet.CreateRow(1);





                    HSSFCellStyle headStyle = workbook.CreateCellStyle();

                    headStyle.Alignment = CellHorizontalAlignment.CENTER;

                    HSSFFont font = workbook.CreateFont();

                    font.FontHeightInPoints = 10;

                    font.Boldweight = 700;

                    headStyle.SetFont(font);





                    foreach (DataColumn column in dtSource.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 填充内容

            HSSFRow dataRow = sheet.CreateRow(rowIndex);

            foreach (DataColumn column in dtSource.Columns)

            {

                HSSFCell newCell = dataRow.CreateCell(column.Ordinal);



                string drValue = row[column].ToString();



                switch (column.DataType.ToString())

                {

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

                        newCell.SetCellValue(drValue);

                        break;

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

                        DateTime dateV;

                        DateTime.TryParse(drValue, out dateV);

                        newCell.SetCellValue(dateV);



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

                        break;

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

                        bool boolV = false;

                        bool.TryParse(drValue, out boolV);

                        newCell.SetCellValue(boolV);

                        break;

                    case "System.Int16"://整型

                    case "System.Int32":

                    case "System.Int64":

                    case "System.Byte":

                        int intV = 0;

                        int.TryParse(drValue, out intV);

                        newCell.SetCellValue(intV);

                        break;

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

                    case "System.Double":

                        double doubV = 0;

                        double.TryParse(drValue, out doubV);

                        newCell.SetCellValue(doubV);

                        break;

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

                        newCell.SetCellValue("");

                        break;

                    default:

                        newCell.SetCellValue("");

                        break;

                }



            }

            #endregion



            rowIndex++;

        }





        using (MemoryStream ms = new MemoryStream())

        {

            workbook.Write(ms);

            ms.Flush();

            ms.Position = 0;



            sheet.Dispose();

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

            return ms;

        }



    }





    /// <summary>

    /// 用于Web导出

    /// </summary>

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

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

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

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

    public static void ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)

    {



        HttpContext curContext = 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>

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

    /// <returns></returns>

    public static DataTable Import(string strFileName)

    {

        DataTable dt = new DataTable();



        HSSFWorkbook hssfworkbook;

        using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))

        {

            hssfworkbook = new HSSFWorkbook(file);

        }

        HSSFSheet sheet = hssfworkbook.GetSheetAt(0);

        System.Collections.IEnumerator rows = sheet.GetRowEnumerator();



        HSSFRow headerRow = sheet.GetRow(0);

        int cellCount = headerRow.LastCellNum;



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

        {

            HSSFCell cell = headerRow.GetCell(j);

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

        }



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

        {

            HSSFRow row = sheet.GetRow(i);

            DataRow dataRow = dt.NewRow();



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

            {

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

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

            }



            dt.Rows.Add(dataRow);

        }

        return dt;

    }



}

 

Aspose.Cells 使用整理 
 

以上

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

1.创建Workbook和Worksheet

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

workbook&worksheet2
Workbook wb = new Workbook();
Worksheet ws = wb.Worksheets[0];
2.给Cell赋值设置背景颜色并加背景色:

cell1
Cell cell = 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, dd mmmm 'yy";
旋转字体:

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

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

//从Cells[0,0]开始创建一个2行3列的Range
Range range = ws.Cells.CreateRange(0, 0, 2, 3);
Cell cell = 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);
Save Excel文件的时候必须调用CalculateFormula方法计算结果.

5.插入图片:

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

6.使用Validations:

validations1
Cells cells = ws.Cells;

cells[12, 0].PutValue("Please enter a number other than 0 to 10 in B1 to activate data validation:");
cells[12, 0].Style.IsTextWrapped = true;

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

Validation validation = validations[validations.Add()];
//Set the data validation type
validation.Type = ValidationType.WholeNumber;
//Set the operator for the data validation
validation.Operator = OperatorType.Between;
//Set the value or expression associated with the data validation
validation.Formula1 = "0";
//the value or expression associated with the second part of the data validation
validation.Formula2 = "10";

validation.ShowError = true;
//Set the validation alert style
validation.AlertStyle = ValidationAlertType.Information;
//Set the title of the data-validation error dialog box
validation.ErrorTitle = "Error";
//Set the data validation error message
validation.ErrorMessage = " Enter value between 0 to 10";
//Set the data validation input message
validation.InputMessage = "Data Validation using Condition for Numbers";
validation.IgnoreBlank = true;
validation.ShowInput = true;
validation.ShowError = true;

//设置Validations的区域,因为现在要Validations的位置是12,1,所以下面设置对应的也要是12,1
CellArea cellArea;
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表功能实现(多个工作簿):http://www.cnblogs.com/zhengjuzhuan/archive/2010/02/01/1661103.html
在 Server 端存取 Excel 檔案的利器:NPOI Library:http://msdn.microsoft.com/zh-tw/ee818993.aspx
ASP.NET使用NPOI类库导出Excel:http://www.cnblogs.com/niunan/archive/2010/03/30/1700706.html

总结:

  通过以上分析,我们不难发现,用NPOI或MyXls代替是Excel是很明智的,在发文前,我看到NPOI及MyXls仍然在活跃的更新中。在使用过程中发现这两个组件极相似,以前看过文章说他们使用的内核是一样的。还有NPOI是国人开发的,且有相关中文文档,在很多地方有相关引用,下载量也很大。并且它支持Excel,看到MyXls相关问题基本上没人回答,所以推荐使用NPOI。MyXls可以直接Cell.Font.Bold操作,而NPOI得使用CellType多少感觉有点麻烦。 

 

 

转载自:http://www.verydemo.com/demo_c298_i6971.html

你可能感兴趣的:(导出Excel)