NPOI+Json文件解析Excel

记点笔记,加深印象!最近有个导入Excel工能需要完成,Excel列名是中文的,导入Excel我用的NPOI插件,如果不对Excel做解析,列名有可能会给我带来一些字符方面的麻烦,于是想到了一个比较low的办法,做一个Json配置文件,对应我的Excel列头,然后读取Excel时与json文件匹配,同时需要校验Excel数据是否合法,创建DataTable。主要代码如下:

1.Json文件:

[
  {
    "Name": "Inventory",
    "CnName":"盘点单明细",
    "Columns": [
      {
        "Name": "warehouseCode",
        "CnName": "仓库编码",
        "Regex": "/^[\\s\\S]*.*[^\\s][\\s\\S]*$/",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "ownerCode",
        "CnName": "货主编码",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "itemCode",
        "CnName": "商品编码",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "itemName",
        "CnName": "商品名称",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "barCode",
        "CnName": "条形码",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "quantity",
        "CnName": "系统数量",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "location",
        "CnName": "货位",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      },
      {
        "Name": "expireDate",
        "CnName": "过期日期",
        "Regex": "",
        "ErrorMsg": "4rwrewrwr"
      }
    ]
  }
]

2.接受Json文件类:

 public class Sheets
    {
        public string Name { get; set; }
        public string CnName { get; set; }
        public List<Column> Columns { get; set; }
    }

 public class Column
    {
        public string Name { get; set; }
        public string CnName { get; set; }
        public string Regex { get; set; }
        public string ErrorMsg { get; set; }
    }

3.具体解析Excel函数

public static DataTable[] ReadExcelToDataTables2(string mapJsonPath, string excelPath,out string msg)
        {
            msg = "";
            List<Sheets> listSheet = new List<Sheets>();
            string jsonFile = mapJsonPath;//@"C:\Users\user\source\repos\ConsoleApp1\ConsoleApp1\Map.json";
            string json = System.IO.File.ReadAllText(jsonFile, Encoding.Default);
            listSheet = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Sheets>>(json);
            string excelpath = excelPath; //@"C:\Users\user\Desktop\test.xls";
            FileStream fs = null;
            DataTable[] tables = null;
            int sheetCount = 0;
            NPOI.HSSF.UserModel.HSSFWorkbook book = null;
            NPOI.XSSF.UserModel.XSSFWorkbook workbook = null;
            try
            {
                using (fs = new FileStream(excelpath, FileMode.Open, FileAccess.Read))
                {
                    try
                    {
                        book = new NPOI.HSSF.UserModel.HSSFWorkbook(fs);
                    }
                    catch (Exception)
                    {
                        fs = new FileStream(excelpath, FileMode.Open, FileAccess.Read);
                        workbook = new XSSFWorkbook(fs);
                    }
                    if (book != null)
                    {
                        sheetCount = book.NumberOfSheets;
                    }
                    else
                    {
                        sheetCount = workbook.NumberOfSheets;
                    }
                    tables = new DataTable[sheetCount];
                    DataTable dt = null;
                    for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
                    {                       
                        NPOI.SS.UserModel.ISheet sheet = null;
                        if (book != null)
                        {
                            sheet = book.GetSheetAt(sheetIndex);
                        }
                        else
                        {
                            sheet = workbook.GetSheetAt(sheetIndex);
                        }
                        if (sheet == null) continue;
                        NPOI.SS.UserModel.IRow row = sheet.GetRow(0);
                        if (row == null) continue;
                        int firstCellNum = row.FirstCellNum;
                        int lastCellNum = row.LastCellNum;
                        if (firstCellNum == lastCellNum) continue;
                        string tempSheetName = sheet.SheetName;
                        string sheetName = listSheet.Find(p => p.CnName == tempSheetName).Name;
                        dt = new DataTable(sheetName);
                        for (int i = firstCellNum; i < lastCellNum; i++)
                        {
                            string fieldTempName = row.GetCell(i).StringCellValue;
                            var fieldName = listSheet[sheetIndex].Columns.Find(p => p.CnName == fieldTempName).Name;
                             dt.Columns.Add(fieldName, typeof(string));
                        }
                        for (int i = 1; i <= sheet.LastRowNum; i++)
                        {
                           
                            DataRow dataRow = dt.Rows.Add();

                            for (int j = firstCellNum; j < lastCellNum; j++)
                            {
                                var cellValue = "";
                                if (sheet.GetRow(i).GetCell(j) != null)
                                {
                                    if (sheet.GetRow(i).GetCell(j).CellType == CellType.Numeric && DateUtil.IsCellDateFormatted(sheet.GetRow(i).GetCell(j)))
                                    {
                                        cellValue = sheet.GetRow(i).GetCell(j).DateCellValue.ToString("yyyy/MM/dd");
                                    }
                                    else
                                    {
                                        sheet.GetRow(i).GetCell(j).SetCellType(NPOI.SS.UserModel.CellType.String);
                                        cellValue = sheet.GetRow(i).GetCell(j).StringCellValue;
                                    }

                                }
                                string errorMsg = listSheet[sheetIndex].Columns[j].ErrorMsg;
                                if (!string.IsNullOrEmpty(errorMsg))
                                {
                                    string regex = listSheet[sheetIndex].Columns[j].Regex;
                                    if (!string.IsNullOrEmpty(regex))
                                    {
                                        Match result = Regex.Match(cellValue, regex); //正则校验
                                        if (!result.Success)
                                        {
                                            msg += string.Format("Excel第{0}个sheet的第{1}行,第{2}列,数据错误:{3}\r\n", sheetIndex + 1, i, j+1, errorMsg);
                                            continue;
                                        }
                                    }                                   
                                }
                                dataRow[j] = cellValue;                               
                            }
                        }
                        if (!string.IsNullOrEmpty(msg))
                        {
                            return new DataTable[] { };
                        }
                        tables[sheetIndex] = dt;
                    }
                }
            }
            catch (Exception e)
            {

                throw e;
            }
            return tables;
        }
    }

 

posted @ 2018-07-24 10:05  stonewl  阅读(728)  评论(0编辑  收藏  举报