Excel帮助类
Excel帮助类操作
public class ExcelHelper
{
/// <summary>
/// 将xls导入List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="stream"></param>
/// <param name="errorstr"></param>
/// <returns></returns>
public static List<T> ImportExcelXLS<T>(Stream stream, out string errorstr)
{
return ConvertDataTable<T>(ImportExcelXLS(stream, out errorstr));
}
public static List<T> ImportExcelXLSX<T>(Stream stream, out string errorstr)
{
return ConvertDataTable<T>(ExcelToTableForXLSX(stream, out errorstr));
}
/// <summary>
/// 读取xls文件
/// </summary>
/// <param name="stream"></param>
/// <param name="errorstr"></param>
/// <returns></returns>
public static DataTable ImportExcelXLS(Stream stream, out string errorstr)
{
try
{
errorstr = string.Empty;
HSSFWorkbook hssfworkbook;
using (Stream memstream = new MemoryStream())
{
using (stream)
{
byte[] bytes = new byte[1024];
int readBtyes;
while ((readBtyes = stream.Read(bytes, 0, bytes.Length)) > 0)
{
memstream.Write(bytes, 0, readBtyes);
}
}
memstream.Position = 0;
hssfworkbook = new HSSFWorkbook(memstream);
}
NPOI.SS.UserModel.ISheet sheet = hssfworkbook.GetSheetAt(0);
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
DataTable dt = new DataTable();
for (int i = 0; i < rowHeader.PhysicalNumberOfCells; i++)
{
dt.Columns.Add(Convert.ToChar(((int)'A') + i).ToString());
}
while (rows.MoveNext())
{
HSSFRow row = (HSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < dt.Columns.Count; i++)
{
NPOI.SS.UserModel.ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i] = null;
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
{
//NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型
if (HSSFDateUtil.IsCellDateFormatted(cell)) //日期类型
{
dr[i] = cell.DateCellValue;
}
else //数值类型
{
dr[i] = cell.NumericCellValue;
}
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Blank) //空数据类型
{
dr[i] = "";
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Formula) //公式类型
{
HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(hssfworkbook);
dr[i] = eva.Evaluate(cell).StringValue;
}
else //其他类型都按字符串类型处理
{
dr[i] = cell.StringCellValue;
}
}
dt.Rows.Add(dr);
}
return dt;
}
catch (Exception ex)
{
errorstr = ex.ToString();
return null;
}
}
/// <summary>
/// 将Excel文件中的数据读出到DataTable中(xlsx)
/// </summary>
/// <param name="file"></param>
/// <returns></returns>
public static DataTable ExcelToTableForXLSX(Stream stream, out string errorstr)
{
try
{
DataTable dt = new DataTable();
errorstr = string.Empty;
XSSFWorkbook xssfworkbook;
using (Stream memstream = new MemoryStream())
{
using (stream)
{
byte[] bytes = new byte[1024];
int readBtyes;
while ((readBtyes = stream.Read(bytes, 0, bytes.Length)) > 0)
{
memstream.Write(bytes, 0, readBtyes);
}
}
memstream.Position = 0;
xssfworkbook = new XSSFWorkbook(memstream);
}
NPOI.SS.UserModel.ISheet sheet = xssfworkbook.GetSheetAt(0);
NPOI.SS.UserModel.IRow rowHeader = sheet.GetRow(0);
System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
for (int i = 0; i < rowHeader.PhysicalNumberOfCells; i++)
{
dt.Columns.Add(Convert.ToChar(((int)'A') + i).ToString());
}
while (rows.MoveNext())
{
XSSFRow row = (XSSFRow)rows.Current;
DataRow dr = dt.NewRow();
for (int i = 0; i < dt.Columns.Count; i++)
{
NPOI.SS.UserModel.ICell cell = row.GetCell(i);
if (cell == null)
{
dr[i] = null;
}
if (cell == null)
{
dr[i] = null;
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Numeric)
{
//NPOI中数字和日期都是NUMERIC类型的,这里对其进行判断是否是日期类型
if (HSSFDateUtil.IsCellDateFormatted(cell)) //日期类型
{
dr[i] = cell.DateCellValue;
}
else //数值类型
{
dr[i] = cell.NumericCellValue;
}
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Blank) //空数据类型
{
dr[i] = "";
}
else if (cell.CellType == NPOI.SS.UserModel.CellType.Formula) //公式类型
{
HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(xssfworkbook);
dr[i] = eva.Evaluate(cell).StringValue;
}
else //其他类型都按字符串类型处理
{
dr[i] = cell.StringCellValue;
}
}
dt.Rows.Add(dr);
}
return dt;
}
catch (Exception ex)
{
errorstr = ex.ToString();
return null;
}
}
/// <summary>
/// 获取单元格类型(xlsx)
/// </summary>
/// <param name="cell"></param>
/// <returns></returns>
private static object GetValueTypeForXLSX(XSSFCell cell)
{
if (cell == null)
return null;
switch (cell.CellType)
{
case CellType.Blank: //BLANK:
return null;
case CellType.Boolean: //BOOLEAN:
return cell.BooleanCellValue;
case CellType.Numeric: //NUMERIC:
return cell.NumericCellValue;
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return "=" + cell.CellFormula;
}
}
/// <summary>
/// 将DataTable转换List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dt"></param>
/// <returns></returns>
private static List<T> ConvertDataTable<T>(DataTable dt)
{
List<T> data = new List<T>();
for (int i = 0; i < dt.Rows.Count; i++)
{
T item = GetItem<T>(dt.Rows[i]);
data.Add(item);
}
return data;
}
/// <summary>
/// 读取Data转换List
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dr"></param>
/// <returns></returns>
private static T GetItem<T>(DataRow dr)
{
Type temp = typeof(T);
T obj = Activator.CreateInstance<T>();
foreach (DataColumn column in dr.Table.Columns)
{
foreach (PropertyInfo pro in temp.GetProperties())
{
if (pro.GetCustomAttribute<ExcelAttribute>() != null && pro.GetCustomAttribute<ExcelAttribute>().ColumnName == dr.Table.Rows[0][column].ToString())
{
pro.SetValue(obj, Convert.ChangeType(dr[column.ColumnName], pro.PropertyType), null);
}
}
}
return obj;
}
public static MemoryStream ExportByList<T>(List<T> dtList, string strHeaderText, string loginName, out string errorstr, int sheetSize = 0xfde8)
{
return Export(ToDataTable<T>(dtList), strHeaderText, loginName, out errorstr, sheetSize);
}
private static DataTable ToDataTable<T>(List<T> list)
{
Type type = typeof(T);
using (DataTable table = new DataTable())
{
Type propertyType;
Type type3;
ExcelAttribute customAttribute;
string str;
DataRow row = table.NewRow();
PropertyInfo[] properties = type.GetProperties();
foreach (PropertyInfo info in properties)
{
if (info.GetCustomAttribute<ExcelAttribute>() != null)
{
propertyType = info.PropertyType;
type3 = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
customAttribute = info.GetCustomAttribute<ExcelAttribute>();
str = customAttribute.ColumnName + (string.IsNullOrEmpty(customAttribute.Format) ? "" : ("@$@" + customAttribute.Format));
table.Columns.Add(str, type3);
}
}
for (int i = 0; i < list.Count; i++)
{
DataRow row2 = table.NewRow();
foreach (PropertyInfo info in properties)
{
propertyType = info.PropertyType;
type3 = Nullable.GetUnderlyingType(propertyType) ?? propertyType;
customAttribute = info.GetCustomAttribute<ExcelAttribute>();
if (customAttribute != null)
{
str = customAttribute.ColumnName + (string.IsNullOrEmpty(customAttribute.Format) ? "" : ("@$@" + customAttribute.Format));
row2[str] = info.GetValue(list[i], null) ?? DBNull.Value;
}
}
table.Rows.Add(row2);
}
return table;
}
}
public static MemoryStream Export(DataTable dtSource, string strHeaderText, string loginName, out string errorstr, int sheetSize = 0xfde8)
{
MemoryStream stream2;
errorstr = "";
try
{
ISheet sheet;
string realColName;
int num2;
int num3;
HSSFWorkbook workbook = new HSSFWorkbook();
List<ISheet> list = new List<ISheet>();
for (int i = dtSource.Rows.Count; i > 0; i -= sheetSize)
{
sheet = workbook.CreateSheet();
list.Add(sheet);
}
if (list.Count == 0)
{
sheet = workbook.CreateSheet();
list.Add(sheet);
}
DocumentSummaryInformation information = PropertySetFactory.CreateDocumentSummaryInformation();
information.Company = "NPOI";
workbook.DocumentSummaryInformation = information;
SummaryInformation information2 = PropertySetFactory.CreateSummaryInformation();
information2.Author = "安鲜达";
information2.ApplicationName = "安鲜达";
information2.LastAuthor = loginName;
information2.Comments = loginName;
information2.Title = "安鲜达";
information2.Subject = "安鲜达表格";
information2.CreateDateTime = new DateTime?(DateTime.Now);
workbook.SummaryInformation = information2;
int[] numArray = new int[dtSource.Columns.Count];
foreach (DataColumn column in dtSource.Columns)
{
realColName = GetRealColName(column.ColumnName);
numArray[column.Ordinal] = Encoding.GetEncoding(0x3a8).GetBytes(realColName).Length;
}
for (num2 = 0; num2 < dtSource.Rows.Count; num2++)
{
num3 = 0;
while (num3 < dtSource.Columns.Count)
{
int length = Encoding.GetEncoding(0x3a8).GetBytes(dtSource.Rows[num2][num3].ToString()).Length;
if (length > numArray[num3])
{
numArray[num3] = length;
}
num3++;
}
}
ICellStyle style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
IFont font = workbook.CreateFont();
font.FontHeightInPoints = 10;
font.Boldweight = 700;
style.SetFont(font);
for (num2 = 0; num2 < list.Count; num2++)
{
IRow row = list[num2].CreateRow(0);
foreach (DataColumn column2 in dtSource.Columns)
{
realColName = GetRealColName(column2.ColumnName);
row.CreateCell(column2.Ordinal).SetCellValue(realColName);
row.GetCell(column2.Ordinal).CellStyle = style;
int num5 = numArray[column2.Ordinal] + 1;
if (num5 > 0xff)
{
num5 = 0xff;
}
list[num2].SetColumnWidth(column2.Ordinal, num5 * 0x100);
}
}
List<ICellStyle> list2 = new List<ICellStyle>();
for (num2 = 0; num2 < dtSource.Columns.Count; num2++)
{
string format = GetFormat(dtSource.Columns[num2].ColumnName);
if (string.IsNullOrEmpty(format))
{
list2.Add(null);
}
else
{
ICellStyle item = workbook.CreateCellStyle();
item.DataFormat = workbook.CreateDataFormat().GetFormat(format);
list2.Add(item);
}
}
int rownum = 1;
for (num2 = 0; num2 < list.Count; num2++)
{
rownum = 1;
int num7 = num2 * sheetSize;
int num8 = (((num2 + 1) * sheetSize) > dtSource.Rows.Count) ? dtSource.Rows.Count : ((num2 + 1) * sheetSize);
for (num3 = num7; num3 < num8; num3++)
{
DataRow row2 = dtSource.Rows[num3];
IRow row3 = list[num2].CreateRow(rownum);
for (int j = 0; j < dtSource.Columns.Count; j++)
{
DateTime minValue;
ICell cell = row3.CreateCell(dtSource.Columns[j].Ordinal);
string str3 = (row2[dtSource.Columns[j]] == null) ? string.Empty : row2[dtSource.Columns[j]].ToString().Trim();
switch (dtSource.Columns[j].DataType.ToString())
{
case "System.String":
{
cell.SetCellValue(str3);
continue;
}
case "System.DateTime":
{
minValue = DateTime.MinValue;
DateTime.TryParse(str3, out minValue);
if (list2[j] == null)
{
break;
}
cell.SetCellValue(minValue);
cell.CellStyle = list2[j];
continue;
}
case "System.Boolean":
{
bool result = false;
bool.TryParse(str3, out result);
cell.SetCellValue(result);
continue;
}
case "System.Int16":
case "System.Int32":
case "System.Int64":
case "System.Byte":
{
int num10 = 0;
int.TryParse(str3, out num10);
cell.SetCellValue((double)num10);
if (list2[j] != null)
{
cell.CellStyle = list2[j];
}
continue;
}
case "System.Decimal":
case "System.Double":
{
double num11 = 0.0;
double.TryParse(str3, out num11);
cell.SetCellValue(num11);
if (list2[j] != null)
{
cell.CellStyle = list2[j];
}
continue;
}
case "System.DBNull":
{
cell.SetCellValue("");
continue;
}
default:
goto Label_06B4;
}
cell.SetCellValue(minValue.ToString("yyyy/MM/dd HH:mm:ss"));
continue;
Label_06B4:
cell.SetCellValue("");
}
rownum++;
}
}
using (MemoryStream stream = new MemoryStream())
{
workbook.Write(stream);
stream.Flush();
stream.Position = 0L;
stream2 = stream;
}
}
catch (Exception exception)
{
errorstr = JsonConvert.SerializeObject(exception);
stream2 = null;
}
return stream2;
}
private static string GetFormat(string oriName)
{
if (string.IsNullOrEmpty(oriName))
{
return null;
}
int index = oriName.IndexOf("@$@");
if (index == -1)
{
return null;
}
return oriName.Substring(index + "@$@".Length).Trim();
}
private static string GetRealColName(string oriName)
{
if (string.IsNullOrEmpty(oriName))
{
return oriName;
}
int index = oriName.IndexOf("@$@");
if (index == -1)
{
return oriName;
}
return oriName.Substring(0, index);
}
public static List<T> Import<T>(Stream stream, out string errorStr)
{
return ConvertDataTable<T>(Import(stream, out errorStr));
}
public static DataTable Import(Stream stream, out string errorStr)
{
try
{
errorStr = "";
HSSFWorkbook workbook = new HSSFWorkbook(stream);
ISheet sheetAt = workbook.GetSheetAt(0);
IRow row = sheetAt.GetRow(0);
IEnumerator rowEnumerator = sheetAt.GetRowEnumerator();
DataTable table = new DataTable();
for (int i = 0; i < row.PhysicalNumberOfCells; i++)
{
table.Columns.Add(Convert.ToChar((int)(0x41 + i)).ToString());
}
while (rowEnumerator.MoveNext())
{
HSSFRow current = (HSSFRow)rowEnumerator.Current;
DataRow row3 = table.NewRow();
for (int j = 0; j < table.Columns.Count; j++)
{
ICell cell = current.GetCell(j);
if (cell == null)
{
row3[j] = null;
}
else if (cell.CellType == CellType.Numeric)
{
if (DateUtil.IsCellDateFormatted(cell))
{
row3[j] = cell.DateCellValue;
}
else
{
row3[j] = cell.NumericCellValue;
}
}
else if (cell.CellType == CellType.Blank)
{
row3[j] = "";
}
else if (cell.CellType == CellType.Formula)
{
HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(workbook);
row3[j] = evaluator.Evaluate(cell).StringValue;
}
else
{
row3[j] = cell.StringCellValue;
}
}
table.Rows.Add(row3);
}
return table;
}
catch (Exception exception)
{
errorStr = JsonConvert.SerializeObject(exception);
return null;
}
}
}
Excel帮助类的更多相关文章
- excel工具类
excel工具类 import com.iport.framework.util.ValidateUtil; import org.apache.commons.lang3.StringUtils; ...
- 导入导出Excel工具类ExcelUtil
前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...
- MVC NPOI Linq导出Excel通用类
之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...
- asp.net(C#) Excel导出类 导出.xls文件
---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft Excel 11.0 Obje ...
- NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中
以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...
- C#EXCEL 操作类--C#ExcelHelper操作类
主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...
- Excel 操作类
转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...
- 30 个 PHP 的 Excel 处理类
下面的 PHP Excel 处理类中,包含 Excel 读写.导入导出等相关的类,列表如下: PHP Excel Reader classes 1. Read Excel Spreadsheets u ...
- 自己封装的poi操作Excel工具类
自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...
- 29 个 PHP 的 Excel 处理类
下面的 PHP Excel 处理类中,包含 Excel 读写.导入导出等相关的类,列表如下: PHP Excel Reader classes 1. Read Excel Spreadsheets u ...
随机推荐
- 本地计算机上的MySQL80服务启动后停止,某些服务在未由其他服务或者程序使用时将自动停止
是由于mysql server XX 路径下的my.ini文件发生错误. 高版本的mysql server的my.ini文件不在mysql server XX路径下,在programdata文件夹(查 ...
- (一)用less+gulp+requireJs 搭建项目(了解less)
项目完结 做个总结: 公司网站重构,整站都需要重写,终于有机会接触下 less,gulp和requireJs,因为以前的工作就是写几个活动页,并没有机会用这些工具,废话不多说,先看下完成后的项目目录: ...
- ASP.NET的Web网页如何进行分页操作(Demo举例)
大概说一下思路,可以利用sql的 Offset/Fetch Next分页,点击这里 这里的Demo利用LINQ的写好的方法 //这里是某个表的列表 skip是跳过前面的多少条数据 take这是跳过前面 ...
- java实现人民币金额大写
在与财务相关的应用中,经常会用到人民币金额的大写,比如发票的打印程序. 本题的任务是:从键盘输入一个十亿以内的正整数(int类型),把它转换为人民币金额大写(不考虑用户输入错误的情况). 比如,用户输 ...
- Java实现第九届蓝桥杯付账问题
付账问题 题目描述 [题目描述] 几个人一起出去吃饭是常有的事.但在结帐的时候,常常会出现一些争执. 现在有 n 个人出去吃饭,他们总共消费了 S 元.其中第 i 个人带了 ai 元.幸运的是,所有人 ...
- JVM性能优化 (一) 初识JVM
一.我们为什么要对JVM做优化 在本地开发环境中我们很少会遇到需要对JVM进行优化的需求,但是到了生产环境,我们可能会有下面的需求: 运行的应用"卡住了",日志不输出,程序没有反应 ...
- 秒懂系列,超详细Java枚举教程!!!
所有知识体系文章,GitHub已收录,欢迎Star!再次感谢,愿你早日进入大厂! GitHub地址: https://github.com/Ziphtracks/JavaLearningmanual ...
- 基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)
系列文章 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目 基于 abp vNext 和 .NET Core 开发博客项目 - 给项目瘦身,让它跑起来 ...
- List集合排序的方法
1.list集合中的对象实现Comparable接口 public class User implements Comparable<User>{ private Integer id; ...
- kali系统安装后乱码的解决
1.先添加kaili的源地址*(这里推荐了几个源,选一个就可以.打开/etc/apt/sources.list 删除里面自带的所有内容,把你复制的内容添加进去保存就ok了) #中科大 deb http ...