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帮助类的更多相关文章

  1. excel工具类

    excel工具类 import com.iport.framework.util.ValidateUtil; import org.apache.commons.lang3.StringUtils; ...

  2. 导入导出Excel工具类ExcelUtil

    前言 前段时间做的分布式集成平台项目中,许多模块都用到了导入导出Excel的功能,于是决定封装一个ExcelUtil类,专门用来处理Excel的导入和导出 本项目的持久化层用的是JPA(底层用hibe ...

  3. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  4. asp.net(C#) Excel导出类 导出.xls文件

    ---恢复内容开始--- using Microsoft.Office.Interop.Excel; 针对office 2003需添加引用Microsoft   Excel   11.0   Obje ...

  5. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  6. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  7. Excel 操作类

    转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...

  8. 30 个 PHP 的 Excel 处理类

    下面的 PHP Excel 处理类中,包含 Excel 读写.导入导出等相关的类,列表如下: PHP Excel Reader classes 1. Read Excel Spreadsheets u ...

  9. 自己封装的poi操作Excel工具类

    自己封装的poi操作Excel工具类 在上一篇文章<使用poi读写Excel>中分享了一下poi操作Excel的简单示例,这次要分享一下我封装的一个Excel操作的工具类. 该工具类主要完 ...

  10. 29 个 PHP 的 Excel 处理类

    下面的 PHP Excel 处理类中,包含 Excel 读写.导入导出等相关的类,列表如下: PHP Excel Reader classes 1. Read Excel Spreadsheets u ...

随机推荐

  1. Rocket - diplomacy - MixedNode

    https://mp.weixin.qq.com/s/zgeAI2n-2cHJi7-Ra5rYZA   介绍MixedNode的实现.     1. 类定义   ​​ ​​   2. inner/ou ...

  2. Chisel3 - bind - Data

    https://mp.weixin.qq.com/s/ENJVkz88sGgyODRNCu9jhQ   介绍Data类中的binding的定义和用法.   Binding stores informa ...

  3. Java 蓝桥杯 算法训练 貌似化学

    ** 貌似化学 ** 问题描述 现在有a,b,c三种原料,如果他们按x:y:z混合,就能产生一种神奇的物品d. 当然不一定只产生一份d,但a,b,c的最简比一定是x:y:z 现在给你3种可供选择的物品 ...

  4. Java实现 LeetCode 13 罗马数字转整数

    13. 罗马数字转整数 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 罗马数字 2 ...

  5. java实现孪生素数

    ** 孪生素数** 孪生素数 所谓孪生素数指的就是间隔为 2 的相邻素数,它们之间的距离已经近得不能再近了,就象孪生兄弟一样.最小的孪生素数是 (3, 5),在 100 以内的孪生素数还有 (5, 7 ...

  6. Python面试常用的高级用法,怎么动态创建类?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第16篇文章,今天我们来聊聊Python当中的元类. 元类是Python当中的高级用法,如果你之前从来没见过这个术语 ...

  7. set基本运用

    /* set集合基本用法 */ #include<iostream> #include<set> using namespace std; //set<T>a; v ...

  8. 4.keras-交叉熵的介绍和应用

    keras-交叉熵的介绍和应用 1.载入数据以及预处理 import numpy as np from keras.datasets import mnist from keras.utils imp ...

  9. Vue点击改变属性(改变文字颜色)

    <template> <div class="tab-control"> <div v-for="(item , index) in tit ...

  10. ODEINT 求解常微分方程(2)

    import numpy as np from scipy.integrate import odeint import matplotlib.pyplot as plt # function tha ...