NPOI通过DataTable导出和读取Excel
Excel导入及导出问题产生:
Excel文件前8行分析数据类型,如果正好你前8行某一列只是数字,那它会认为你这一列就是数值型的,然后,身份证,手机,编号都转吧变成类似这样的
1.42702E+17格式,日期列变成
包含日期和数字的,乱的很,可以通过改注册表让Excel分析整个表,但如果整列都是数字,那这个问题还是解决不了。
使用第三方开源组件导入及导出Excel的解决方案:
接对Excel进行读或写,而不依赖Office 的
Excel,这不管对于ASP.net或Winform都非常有利,不用担心Excel进程的释放问题,服务器安全,设置,导出,导入“Excel智能识
别”,公式日期等问题,可以说以前的Excel问题,全都不用管了,它们可以很好的帮你解决,NPOI || MyXls == 研究几年Excel。
参考地址:
- public class NPOIHelper
- {
- /// <summary>
- /// DataTable导出到Excel文件,winform
- /// </summary>
- /// <param name="dtSource">源DataTable</param>
- /// <param name="strHeaderText">表头文本</param>
- /// <param name="strFileName">保存位置</param>
- 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, , data.Length);
- fs.Flush();
- }
- }
- }
- /// <summary>
- /// DataTable导出到Excel的MemoryStream
- /// </summary>
- /// <param name="dtSource">源DataTable</param>
- /// <param name="strHeaderText">表头文本</param>
- public static MemoryStream Export(DataTable dtSource, string strHeaderText)
- {
- HSSFWorkbook workbook = new HSSFWorkbook();
- HSSFSheet sheet = (HSSFSheet)workbook.CreateSheet();
- HSSFCellStyle dateStyle = (HSSFCellStyle)workbook.CreateCellStyle();
- HSSFDataFormat format = (HSSFDataFormat)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().GetBytes(item.ColumnName.ToString()).Length;
- }
- ; i < dtSource.Rows.Count; i++)
- {
- ; j < dtSource.Columns.Count; j++)
- {
- ).GetBytes(dtSource.Rows[i][j].ToString()).Length;
- if (intTemp > arrColWidth[j])
- {
- arrColWidth[j] = intTemp;
- }
- }
- }
- ;
- foreach (DataRow row in dtSource.Rows)
- {
- #region 新建表,填充表头,填充列头,样式
- || rowIndex == )
- {
- )
- {
- sheet = (HSSFSheet)workbook.CreateSheet();
- }
- #region 表头及样式
- {
- HSSFRow headerRow = (HSSFRow)sheet.CreateRow();
- headerRow.HeightInPoints = ;
- headerRow.CreateCell().SetCellValue(strHeaderText);
- HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
- headStyle.Alignment = HorizontalAlignment.Center;
- HSSFFont font = (HSSFFont)workbook.CreateFont();
- font.FontHeightInPoints = ;
- font.Boldweight = ;
- headStyle.SetFont(font);
- headerRow.GetCell().CellStyle = headStyle;
- sheet.AddMergedRegion(, , , dtSource.Columns.Count - ));
- }
- #endregion
- #region 列头及样式
- {
- HSSFRow headerRow = (HSSFRow)sheet.CreateRow();
- HSSFCellStyle headStyle = (HSSFCellStyle)workbook.CreateCellStyle();
- headStyle.Alignment = HorizontalAlignment.Center;
- HSSFFont font = (HSSFFont)workbook.CreateFont();
- font.FontHeightInPoints = ;
- font.Boldweight = ;
- 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] + ) * );
- }
- }
- #endregion
- rowIndex = ;
- }
- #endregion
- #region 填充内容
- HSSFRow dataRow = (HSSFRow)sheet.CreateRow(rowIndex);
- foreach (DataColumn column in dtSource.Columns)
- {
- HSSFCell newCell = (HSSFCell)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.TryParse(drValue, out intV);
- newCell.SetCellValue(intV);
- break;
- case "System.Decimal"://浮点型
- case "System.Double":
- ;
- double.TryParse(drValue, out doubV);
- newCell.SetCellValue(doubV);
- break;
- case "System.DBNull"://空值处理
- newCell.SetCellValue("");
- break;
- default:
- newCell.SetCellValue("");
- break;
- }
- }
- #endregion
- rowIndex++;
- }
- #region 合并相同列不成功
- ////合并列相同的
- //int columnCount = 0; //记录sheet一行的总列数
- //int start = 0;
- //int end = 0;
- //string cellText = "";
- //string temp = "";
- //for (int i = 0; i < workbook.NumberOfSheets; i++) //NumberOfSheets是xls中总共的表数
- //{
- // ISheet sht = workbook.GetSheetAt(i); //读取当前表数据
- // columnCount = sht.GetRow(3).LastCellNum;
- // for (int j = 0; j <= columnCount; j++)
- // {
- // for (int k = 2; k < sheet.LastRowNum; k++) //
- // {
- // ICell icell = sht.GetRow(k).GetCell(j);
- // if (icell != null)
- // {
- // cellText = icell.ToString();//获取单元格的值
- // if ((k + 1) <= sht.LastRowNum) //比较当前列下一行单元格的值
- // {
- // IRow iRow = sht.GetRow(k + 1);
- // if (iRow != null)
- // {
- // temp = iRow.GetCell(j).ToString();
- // if (cellText == temp) //如果列上下值相同
- // {
- // //start = k; //给开始的行号
- // //end = k + 1;
- // CellRangeAddress region = new CellRangeAddress(k, k + 1, j, j); //四个参数为:起始行,结束行,起始列,结束列
- // sht.AddMergedRegion(region);
- // }
- // //else //列上下值不相同
- // //{
- // // CellRangeAddress region = new CellRangeAddress(start,j , end, j);
- // // sht.AddMergedRegion(region);
- // // //合并之后重新给cellText赋值
- // //}
- // }
- // }
- // }
- // }
- // }
- //}
- #endregion
- using (MemoryStream ms = new MemoryStream())
- {
- workbook.Write(ms);
- ms.Flush();
- ms.Position = ;
- //workbook.Dispose();//一般只用写这一个就OK了,他会遍历并释放所有资源,但当前版本有问题所以只释放sheet
- return ms;
- }
- }
- /// <summary>
- /// 用于Web导出
- /// </summary>
- /// <param name="dtSource">源DataTable</param>
- /// <param name="strHeaderText">表头文本</param>
- /// <param name="strFileName">文件名</param>
- 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=" + strFileName);
- 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 = (HSSFSheet)hssfworkbook.GetSheetAt();
- System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
- HSSFRow headerRow = (HSSFRow)sheet.GetRow();
- int cellCount = headerRow.LastCellNum;
- ; j < cellCount; j++)
- {
- HSSFCell cell = (HSSFCell)headerRow.GetCell(j);
- dt.Columns.Add(cell.ToString());
- }
- ); i <= sheet.LastRowNum; i++)
- {
- HSSFRow row = (HSSFRow)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;
- }
- }
本文参考并使用转自的博文地址:http://www.cnblogs.com/yongfa365/archive/2010/05/10/NPOI-MyXls-DataTable-To-Excel-From-Excel.html
NPOI通过DataTable导出和读取Excel的更多相关文章
- 使用NPOI导出,读取EXCEL(可追加功能)
使用NPOI导出,读取EXCEL,具有可追加功能 看代码 using System; using System.Collections.Generic; using System.Text; usin ...
- java导出和读取excel数据
使用的是poi的jar包 下载地址http://poi.apache.org/download.html 主要是把jar包导入,直接新建一个列子测试一下就明白了.使用起来还是比较方便的,代码里面的原理 ...
- datatable导出到Word / Excel / PDF / HTML .NET
原文发布时间为:2011-01-21 -- 来源于本人的百度文章 [由搬家工具导入] IEnumerable - DataTable Export to Word / Excel / PDF / HT ...
- NPOI使用Datatable导出到Excel
首先要引用dll 下载地址:http://pan.baidu.com/s/1dFr2m 引入命名空间: using NPOI.HSSF.UserModel;using NPOI.SS.UserMode ...
- Npoi List DataTable导出一个Excel多个sheet 下载
参考: http://blog.csdn.net/zhouqinghe24/article/details/8649346 参考下载http://www.cnblogs.com/dyllove98/a ...
- DataTable导出为word,excel,html,csv,pdf,.txt
using System; using System.Data; using System.Configuration; using System.Collections; using System. ...
- c#使用aspose.cells 从datatable导出数据到excel
string json=value.Value; DataTable dt=Utils.JsonDataTableConvert.ToDataTable(json); string fileName ...
- asp.net 使用NPOI读取excel文件
asp.net 使用NPOI读取excel文件内容 NPOI下载地址:NPOI public class ExcelHelper { /// <summary> /// 读取Excel文件 ...
- c#(NPOI)DataTable导出execl,execl(支持解析公式)导入DataTable
NPOI(C#)DataTable导出execl using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserMod ...
随机推荐
- 解决mdi窗体闪烁的问题
/// 解决mdi窗体闪烁的问题 /// </summary> protected override CreateParams CreateParams { get { CreatePar ...
- poj1159 dp(滚动数组优化)
H - 简单dp 例题扩展 Crawling in process... Crawling failed Time Limit:3000MS Memory Limit:65536KB ...
- 医院设置 codevs 2577
Floyd+二叉树 #include<iostream>#include<cstdlib>#include<cstdio>#include<cstring&g ...
- python爬虫下载youtube单个视频
__author__ = 'Sentinel'import requestsimport reimport jsonimport sysimport shutilimport urlparse &qu ...
- Modified Kaprekar Numbers
Link: https://www.hackerrank.com/challenges/kaprekar-numbers from __future__ import print_function d ...
- Maven+SpringMVC+Mybatis 开发环境整合
1.maven build遇到了如下问题: [ERROR] Failed to execute goal org.codehaus.mojo:tomcat-maven-plugin:1.1:rede ...
- 再谈Redirect(客户端重定向)和Dispatch(服务器端重定向)
这是两个常常被放在一起进行比较的概念,今天对这两个概念再重新回顾一下,前者发生在客户端(浏览器),后者发生在服务器端,因此也有人把前者称为客户端重定向,把后者称为服务器端重定向,虽然对于后者这种称谓并 ...
- pcduino通过USB方式刷机
最近买了块pcduino来玩,一开始也不知道怎么入手使用,就想先学着网上来刷机,可以用TF卡来刷机,也可以用U盘来刷机.由于手上只有优盘,所以采用了第二种方式.具体方法参考了网上. 本文非原创,原文来 ...
- getResources().getXml()获取xml
获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是 ...
- linux type 命令和Linux的五个查找命令
type命令用来显示指定命令的类型.一个命令的类型可以是如下之一 alias 别名 keyword 关键字,Shell保留字 function 函数,Shell函数 builtin 内建命令,Shel ...