zoukankan      html  css  js  c++  java
  • 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;
    }
    }
    }

  • 相关阅读:
    如何利用python制作微信好友头像照片墙?
    机器学习入门路线和资源
    突然“被辞职”的时候,原来可以拿到这么多钱!
    一个致命的 Redis 命令,导致公司损失 400 万
    程序员:想知道你每天按了多少次键盘吗?
    想了解真实的中国历史吗?建议看看这10部历史纪录片,受益终生!
    SpringBlade 2.0-RC3 发布,全新的微服务开发平台
    Syncd-开源自动化部署工具
    学习Spring Boot看这两个开源项目就够了!非得值得收藏的资源
    大型视频直播平台架构由浅入深详细讲解
  • 原文地址:https://www.cnblogs.com/badboys/p/7582061.html
Copyright © 2011-2022 走看看