• 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://www.evget.com/zh-CN/product/563/feature_en.aspx

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

    1. /// <summary>
    2. /// MyXls简单Demo,快速入门代码
    3. /// </summary>
    4. /// <param name="dtSource"></param>
    5. /// <param name="strFileName"></param>
    6. /// <remarks>MyXls认为Excel的第一个单元格是:(1,1)</remarks>
    7. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
    8. publicstaticvoid ExportEasy(DataTable dtSource, string strFileName)
    9. {
    10. XlsDocument xls = new XlsDocument();
    11. Worksheet sheet = xls.Workbook.Worksheets.Add("Sheet1");
    12. //填充表头
    13. foreach (DataColumn col in dtSource.Columns)
    14. {
    15. sheet.Cells.Add(1, col.Ordinal + 1, col.ColumnName);
    16. }
    17. //填充内容
    18. for (int i = 0; i < dtSource.Rows.Count; i++)
    19. {
    20. for (int j = 0; j < dtSource.Columns.Count; j++)
    21. {
    22. sheet.Cells.Add(i + 2, j + 1, dtSource.Rows[i][j].ToString());
    23. }
    24. }
    25. //保存
    26. xls.FileName = strFileName;
    27. xls.Save();
    28. }
    /// <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 快速入门例子:

    1. /// <summary>
    2. /// NPOI简单Demo,快速入门代码
    3. /// </summary>
    4. /// <param name="dtSource"></param>
    5. /// <param name="strFileName"></param>
    6. /// <remarks>NPOI认为Excel的第一个单元格是:(0,0)</remarks>
    7. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
    8. publicstaticvoid ExportEasy(DataTable dtSource, string strFileName)
    9. {
    10. HSSFWorkbook workbook = new HSSFWorkbook();
    11. HSSFSheet sheet = workbook.CreateSheet();
    12. //填充表头
    13. HSSFRow dataRow = sheet.CreateRow(0);
    14. foreach (DataColumn column in dtSource.Columns)
    15. {
    16. dataRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    17. }
    18. //填充内容
    19. for (int i = 0; i < dtSource.Rows.Count; i++)
    20. {
    21. dataRow = sheet.CreateRow(i + 1);
    22. for (int j = 0; j < dtSource.Columns.Count; j++)
    23. {
    24. dataRow.CreateCell(j).SetCellValue(dtSource.Rows[i][j].ToString());
    25. }
    26. }
    27. //保存
    28. using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
    29. {
    30. workbook.Write(fs);
    31. }
    32. workbook.Dispose();
    33. }
    /// <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导出相关类:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Linq;
    4. using System.Text;
    5. using org.in2bits.MyXls;
    6. using org.in2bits.MyXls.ByteUtil;
    7. using System.Data;
    8. class ExcelHelper
    9. {
    10. publicstaticvoid Export(DataTable dtSource, string strHeaderText, string strFileName)
    11. {
    12. XlsDocument xls = new XlsDocument();
    13. xls.FileName = DateTime.Now.ToString("yyyyMMddHHmmssffff", System.Globalization.DateTimeFormatInfo.InvariantInfo);
    14. xls.SummaryInformation.Author = "yongfa365"; //填加xls文件作者信息
    15. xls.SummaryInformation.NameOfCreatingApplication = "liu yongfa"; //填加xls文件创建程序信息
    16. xls.SummaryInformation.LastSavedBy = "LastSavedBy"; //填加xls文件最后保存者信息
    17. xls.SummaryInformation.Comments = "Comments"; //填加xls文件作者信息
    18. xls.SummaryInformation.Title = "title"; //填加xls文件标题信息
    19. xls.SummaryInformation.Subject = "Subject";//填加文件主题信息
    20. xls.DocumentSummaryInformation.Company = "company";//填加文件公司信息
    21. Worksheet sheet = xls.Workbook.Worksheets.Add("Sheet1");//状态栏标题名称
    22. Cells cells = sheet.Cells;
    23. foreach (DataColumn col in dtSource.Columns)
    24. {
    25. Cell cell = cells.Add(1, col.Ordinal + 1, col.ColumnName);
    26. cell.Font.FontFamily = FontFamilies.Roman; //字体
    27. cell.Font.Bold = true; //字体为粗体
    28. }
    29. #region 填充内容
    30. XF dateStyle = xls.NewXF();
    31. dateStyle.Format = "yyyy-mm-dd";
    32. for (int i = 0; i < dtSource.Rows.Count; i++)
    33. {
    34. for (int j = 0; j < dtSource.Columns.Count; j++)
    35. {
    36. int rowIndex = i + 2;
    37. int colIndex = j + 1;
    38. string drValue = dtSource.Rows[i][j].ToString();
    39. switch (dtSource.Rows[i][j].GetType().ToString())
    40. {
    41. case"System.String"://字符串类型
    42. cells.Add(rowIndex, colIndex, drValue);
    43. break;
    44. case"System.DateTime"://日期类型
    45. DateTime dateV;
    46. DateTime.TryParse(drValue, out dateV);
    47. cells.Add(rowIndex, colIndex, dateV, dateStyle);
    48. break;
    49. case"System.Boolean"://布尔型
    50. bool boolV = false;
    51. bool.TryParse(drValue, out boolV);
    52. cells.Add(rowIndex, colIndex, boolV);
    53. break;
    54. case"System.Int16"://整型
    55. case"System.Int32":
    56. case"System.Int64":
    57. case"System.Byte":
    58. int intV = 0;
    59. int.TryParse(drValue, out intV);
    60. cells.Add(rowIndex, colIndex, intV);
    61. break;
    62. case"System.Decimal"://浮点型
    63. case"System.Double":
    64. double doubV = 0;
    65. double.TryParse(drValue, out doubV);
    66. cells.Add(rowIndex, colIndex, doubV);
    67. break;
    68. case"System.DBNull"://空值处理
    69. cells.Add(rowIndex, colIndex, null);
    70. break;
    71. default:
    72. cells.Add(rowIndex, colIndex, null);
    73. break;
    74. }
    75. }
    76. }
    77. #endregion
    78. xls.FileName = strFileName;
    79. xls.Save();
    80. }
    81. }
    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导入导出相关类:

    1. using System;
    2. using System.Collections.Generic;
    3. using System.Data;
    4. using System.IO;
    5. using System.Text;
    6. using System.Web;
    7. using NPOI;
    8. using NPOI.HPSF;
    9. using NPOI.HSSF;
    10. using NPOI.HSSF.UserModel;
    11. using NPOI.HSSF.Util;
    12. using NPOI.POIFS;
    13. using NPOI.Util;
    14. publicclass ExcelHelper
    15. {
    16. /// <summary>
    17. /// DataTable导出到Excel文件
    18. /// </summary>
    19. /// <param name="dtSource">源DataTable</param>
    20. /// <param name="strHeaderText">表头文本</param>
    21. /// <param name="strFileName">保存位置</param>
    22. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
    23. publicstaticvoid Export(DataTable dtSource, string strHeaderText, string strFileName)
    24. {
    25. using (MemoryStream ms = Export(dtSource, strHeaderText))
    26. {
    27. using (FileStream fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
    28. {
    29. byte[] data = ms.ToArray();
    30. fs.Write(data, 0, data.Length);
    31. fs.Flush();
    32. }
    33. }
    34. }
    35. /// <summary>
    36. /// DataTable导出到Excel的MemoryStream
    37. /// </summary>
    38. /// <param name="dtSource">源DataTable</param>
    39. /// <param name="strHeaderText">表头文本</param>
    40. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
    41. publicstatic MemoryStream Export(DataTable dtSource, string strHeaderText)
    42. {
    43. HSSFWorkbook workbook = new HSSFWorkbook();
    44. HSSFSheet sheet = workbook.CreateSheet();
    45. #region 右击文件 属性信息
    46. {
    47. DocumentSummaryInformation dsi = PropertySetFactory.CreateDocumentSummaryInformation();
    48. dsi.Company = "http://www.yongfa365.com/";
    49. workbook.DocumentSummaryInformation = dsi;
    50. SummaryInformation si = PropertySetFactory.CreateSummaryInformation();
    51. si.Author = "柳永法"; //填加xls文件作者信息
    52. si.ApplicationName = "NPOI测试程序"; //填加xls文件创建程序信息
    53. si.LastAuthor = "柳永法2"; //填加xls文件最后保存者信息
    54. si.Comments = "说明信息"; //填加xls文件作者信息
    55. si.Title = "NPOI测试"; //填加xls文件标题信息
    56. si.Subject = "NPOI测试Demo";//填加文件主题信息
    57. si.CreateDateTime = DateTime.Now;
    58. workbook.SummaryInformation = si;
    59. }
    60. #endregion
    61. HSSFCellStyle dateStyle = workbook.CreateCellStyle();
    62. HSSFDataFormat format = workbook.CreateDataFormat();
    63. dateStyle.DataFormat = format.GetFormat("yyyy-mm-dd");
    64. //取得列宽
    65. int[] arrColWidth = newint[dtSource.Columns.Count];
    66. foreach (DataColumn item in dtSource.Columns)
    67. {
    68. arrColWidth[item.Ordinal] = Encoding.GetEncoding(936).GetBytes(item.ColumnName.ToString()).Length;
    69. }
    70. for (int i = 0; i < dtSource.Rows.Count; i++)
    71. {
    72. for (int j = 0; j < dtSource.Columns.Count; j++)
    73. {
    74. int intTemp = Encoding.GetEncoding(936).GetBytes(dtSource.Rows[i][j].ToString()).Length;
    75. if (intTemp > arrColWidth[j])
    76. {
    77. arrColWidth[j] = intTemp;
    78. }
    79. }
    80. }
    81. int rowIndex = 0;
    82. foreach (DataRow row in dtSource.Rows)
    83. {
    84. #region 新建表,填充表头,填充列头,样式
    85. if (rowIndex == 65535 || rowIndex == 0)
    86. {
    87. if (rowIndex != 0)
    88. {
    89. sheet = workbook.CreateSheet();
    90. }
    91. #region 表头及样式
    92. {
    93. HSSFRow headerRow = sheet.CreateRow(0);
    94. headerRow.HeightInPoints = 25;
    95. headerRow.CreateCell(0).SetCellValue(strHeaderText);
    96. HSSFCellStyle headStyle = workbook.CreateCellStyle();
    97. headStyle.Alignment = CellHorizontalAlignment.CENTER;
    98. HSSFFont font = workbook.CreateFont();
    99. font.FontHeightInPoints = 20;
    100. font.Boldweight = 700;
    101. headStyle.SetFont(font);
    102. headerRow.GetCell(0).CellStyle = headStyle;
    103. sheet.AddMergedRegion(new Region(0, 0, 0, dtSource.Columns.Count - 1));
    104. headerRow.Dispose();
    105. }
    106. #endregion
    107. #region 列头及样式
    108. {
    109. HSSFRow headerRow = sheet.CreateRow(1);
    110. HSSFCellStyle headStyle = workbook.CreateCellStyle();
    111. headStyle.Alignment = CellHorizontalAlignment.CENTER;
    112. HSSFFont font = workbook.CreateFont();
    113. font.FontHeightInPoints = 10;
    114. font.Boldweight = 700;
    115. headStyle.SetFont(font);
    116. foreach (DataColumn column in dtSource.Columns)
    117. {
    118. headerRow.CreateCell(column.Ordinal).SetCellValue(column.ColumnName);
    119. headerRow.GetCell(column.Ordinal).CellStyle = headStyle;
    120. //设置列宽
    121. sheet.SetColumnWidth(column.Ordinal, (arrColWidth[column.Ordinal] + 1) * 256);
    122. }
    123. headerRow.Dispose();
    124. }
    125. #endregion
    126. rowIndex = 2;
    127. }
    128. #endregion
    129. #region 填充内容
    130. HSSFRow dataRow = sheet.CreateRow(rowIndex);
    131. foreach (DataColumn column in dtSource.Columns)
    132. {
    133. HSSFCell newCell = dataRow.CreateCell(column.Ordinal);
    134. string drValue = row[column].ToString();
    135. switch (column.DataType.ToString())
    136. {
    137. case"System.String"://字符串类型
    138. newCell.SetCellValue(drValue);
    139. break;
    140. case"System.DateTime"://日期类型
    141. DateTime dateV;
    142. DateTime.TryParse(drValue, out dateV);
    143. newCell.SetCellValue(dateV);
    144. newCell.CellStyle = dateStyle;//格式化显示
    145. break;
    146. case"System.Boolean"://布尔型
    147. bool boolV = false;
    148. bool.TryParse(drValue, out boolV);
    149. newCell.SetCellValue(boolV);
    150. break;
    151. case"System.Int16"://整型
    152. case"System.Int32":
    153. case"System.Int64":
    154. case"System.Byte":
    155. int intV = 0;
    156. int.TryParse(drValue, out intV);
    157. newCell.SetCellValue(intV);
    158. break;
    159. case"System.Decimal"://浮点型
    160. case"System.Double":
    161. double doubV = 0;
    162. double.TryParse(drValue, out doubV);
    163. newCell.SetCellValue(doubV);
    164. break;
    165. case"System.DBNull"://空值处理
    166. newCell.SetCellValue("");
    167. break;
    168. default:
    169. newCell.SetCellValue("");
    170. break;
    171. }
    172. }
    173. #endregion
    174. rowIndex++;
    175. }
    176. using (MemoryStream ms = new MemoryStream())
    177. {
    178. workbook.Write(ms);
    179. ms.Flush();
    180. ms.Position = 0;
    181. sheet.Dispose();
    182. //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
    183. return ms;
    184. }
    185. }
    186. /// <summary>
    187. /// 用于Web导出
    188. /// </summary>
    189. /// <param name="dtSource">源DataTable</param>
    190. /// <param name="strHeaderText">表头文本</param>
    191. /// <param name="strFileName">文件名</param>
    192. /// <Author>柳永法 http://www.yongfa365.com/ 2010-5-8 22:21:41</Author>
    193. publicstaticvoid ExportByWeb(DataTable dtSource, string strHeaderText, string strFileName)
    194. {
    195. HttpContext curContext = HttpContext.Current;
    196. // 设置编码和附件格式
    197. curContext.Response.ContentType = "application/vnd.ms-excel";
    198. curContext.Response.ContentEncoding = Encoding.UTF8;
    199. curContext.Response.Charset = "";
    200. curContext.Response.AppendHeader("Content-Disposition",
    201. "attachment;filename=" + HttpUtility.UrlEncode(strFileName, Encoding.UTF8));
    202. curContext.Response.BinaryWrite(Export(dtSource, strHeaderText).GetBuffer());
    203. curContext.Response.End();
    204. }
    205. /// <summary>读取excel
    206. /// 默认第一行为标头
    207. /// </summary>
    208. /// <param name="strFileName">excel文档路径</param>
    209. /// <returns></returns>
    210. publicstatic DataTable Import(string strFileName)
    211. {
    212. DataTable dt = new DataTable();
    213. HSSFWorkbook hssfworkbook;
    214. using (FileStream file = new FileStream(strFileName, FileMode.Open, FileAccess.Read))
    215. {
    216. hssfworkbook = new HSSFWorkbook(file);
    217. }
    218. HSSFSheet sheet = hssfworkbook.GetSheetAt(0);
    219. System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
    220. HSSFRow headerRow = sheet.GetRow(0);
    221. int cellCount = headerRow.LastCellNum;
    222. for (int j = 0; j < cellCount; j++)
    223. {
    224. HSSFCell cell = headerRow.GetCell(j);
    225. dt.Columns.Add(cell.ToString());
    226. }
    227. for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
    228. {
    229. HSSFRow row = sheet.GetRow(i);
    230. DataRow dataRow = dt.NewRow();
    231. for (int j = row.FirstCellNum; j < cellCount; j++)
    232. {
    233. if (row.GetCell(j) != null)
    234. dataRow[j] = row.GetCell(j).ToString();
    235. }
    236. dt.Rows.Add(dataRow);
    237. }
    238. return dt;
    239. }
    240. }
    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多少感觉有点麻烦。 

  • 相关阅读:
    最长公共子序列
    小测试 炒书
    洛谷P1968 美元汇率
    洛谷P3611 [USACO17JAN]Cow Dance Show奶牛舞蹈
    【刷题】【树】【模拟】树网的核
    【刷题】【dp】地精的贸易
    【刷题】【模拟】复制cs
    【刷题】【模拟】3n+1
    【刷题】【dp】中国象棋
    【刷题】【搜索】新数独
  • 原文地址:https://www.cnblogs.com/wangrsh2010/p/2410182.html
Copyright © 2020-2023  润新知