[Excel Export], Excel 전 lua, json, xml 개발 도구

본문:
기초 하 다https://github.com/monkey256/ExcelExport 개발 의 재 개판,
이전 버 전에 비해:
1. 새 버 전 은 공식 내 보 내기, 다 중 언어 내 보 내기 2. 불필요 한 기능 을 제거 하고 핵심 코드 최적화 3. 수치 검증 4. 설명 표 와 수치 표를 하나 로 합 쳐 보기 편리 합 니 다. 5. 빈 열 삽입 지원 6. 정의 필드 에 따라 클 라 이언 트 와 서버 2 부 를 내 보 냅 니 다. 언어 패 키 지 는 독립 적 으로 처리 되 고 언어 에 따라 여러 부 를 생 성 합 니 다. lua 파일 
    

1.    :
    “    ”
                .xlsx .xls                .lua    .xml  
    “     ”
           【Language】,         ,          .lua  

2.         :
    ***      ***  -h|-help
          : tablegen2.exe -h

    ***    ***  -p handyExp
          : tablegen2.exe -i fullPath -o outputDir -p handyExp

    ***       ***  -p xml|json|lua
          : tablegen2.exe -i fullPath -o outputDir -p lua

 
using System;
using System.Collections.Generic;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
using NPOI.XSSF.UserModel;
using System.Collections;
using tablegen2.common;

namespace tablegen2.logic
{
    public static class TableExcelReader
    {
        // def       
        private const int DEF_HEADER_INDEX = 3;
        // data     
        private const int DATA_HEADER_INDEX = DEF_HEADER_INDEX + 1;
        // data     
        private const int DATA_DATA_INDEX = DEF_HEADER_INDEX + 2;

        //         xls
        public static TableExcelData loadFromExcel(string filePath)
        {
            if (!File.Exists(filePath))
                throw new Exception(string.Format("{0}      !", filePath));

            var ext = Path.GetExtension(filePath).ToLower();
            if (ext != ".xls" && ext != ".xlsx")
                throw new Exception(string.Format("           {0}", ext));

            var headers = new List();
            var rows = new List();

            var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            //   xls      
            var workbook = ext == ".xls" ? (IWorkbook)new HSSFWorkbook(fs) : (IWorkbook)new XSSFWorkbook(fs);
            fs.Close();

            _readDataFromWorkbook(workbook, headers, rows);

            return new TableExcelData(headers, rows);
        }

        private static void _readDataFromWorkbook(IWorkbook wb, List defHeader, List rows)
        {
            var dataSheet = _checkSheetValidity(wb, AppData.Config.SheetNameForData);

            var defHeaderIdx = new ArrayList();
            var dataList = new List>();

            //   Sheet      
            _checkSheetIsNullRow(dataSheet, AppData.Config.SheetNameForData);
            //   def
            _readDefSheet(dataSheet, defHeader);
            //   data        
            _checkHeadersFromDataSheet(dataSheet, defHeader);
            //   data            
            _checkAllDataSheetValidity(dataSheet, defHeader);
            //   data    ID       
            _checkDataSheetKeyUnique(dataSheet, defHeader, "Id");
            //   data
            _readDataSheet(dataSheet, defHeader, rows);
        }

        private static ISheet _checkSheetValidity(IWorkbook wb, string name)
        {
            var sheet = wb.GetSheet(name);
            if (sheet == null)
            {
                throw new Exception(string.Format("   '{0}'   ", name));
            }
            return sheet;
        }


        //   Sheet      
        private static void _checkSheetIsNullRow(ISheet sheet, string sheetName)
        {
            string errMsg = string.Empty;
            for (int idxRow = 1; idxRow <= sheet.LastRowNum; idxRow++)
            {
                var rd = sheet.GetRow(idxRow);
                if (rd == null)
                {
                    errMsg = errMsg + string.Format("   '{0}'  {1}    
", sheetName, (idxRow + 1).ToString()); } } if (!String.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } } // def private static void _readDefSheet(ISheet sheet, List headers) { string errMsg = string.Empty; var rowList = new List(); var strList = new List(); for (int i = 0; i <= DEF_HEADER_INDEX; i++) { rowList.Add(sheet.GetRow(i)); strList.Add(string.Empty); } var maxCellNum = sheet.GetRow(0).LastCellNum; for (int idx = 0; idx < maxCellNum; idx++) { for (int idxRow = 0; idxRow < rowList.Count; idxRow++) { if (rowList[idxRow] != null) { strList[idxRow] = _convertCellToString(rowList[idxRow].GetCell(idx)); } } Log.Msg(" Def ==> Name【{0}】 Type【{1}】 ExpType【{2}】 Desc【{3}】", strList[0], strList[1], strList[2], strList[3]); if (!string.IsNullOrEmpty(strList[0]) && !string.IsNullOrEmpty(strList[1]) && !string.IsNullOrEmpty(strList[2])) { var header = new TableExcelHeader(); header.FieldName = strList[0]; header.FieldType = strList[1].ToLower(); header.FieldExpType = strList[2]; header.FieldDesc = strList[3]; header.FieldIndex = -1; headers.Add(header); } else if (!(string.IsNullOrEmpty(strList[0]) && string.IsNullOrEmpty(strList[1]) && string.IsNullOrEmpty(strList[2]))) { errMsg = errMsg + string.Format(" Def [{0},{1}] [{0},{2}] [{0},{3}] !
", _sheetNumToEng(idx), 1, 2, 3); } } if (!String.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } // Def ID if (headers.Find(a => a.FieldName == "Id") == null) { throw new Exception(string.Format(" Def Id !")); } } // Data private static void _checkHeadersFromDataSheet(ISheet sheet, List headers) { string errMsg = string.Empty; var rd = sheet.GetRow(DATA_HEADER_INDEX); // for (int idxCell = 0; idxCell < rd.LastCellNum; idxCell++) { var cell = rd.GetCell(idxCell); if (cell != null && !String.IsNullOrEmpty(cell.StringCellValue)) { int HeadIdx = headers.FindIndex(item => item.FieldName.Equals(cell.StringCellValue)); if (HeadIdx != -1) { headers[HeadIdx].FieldIndex = idxCell; } else { // data errMsg = errMsg + string.Format(" Data :'{0}'
", cell.StringCellValue); } } } foreach (var list in headers) { if (list.FieldIndex == -1) { errMsg = errMsg + string.Format(" Def :'{0}'
", list.FieldName); } } if (!String.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } } // data private static void _checkAllDataSheetValidity(ISheet sheet, List headers) { //Log.Msg("LastRowNum {0}", sheet.LastRowNum.ToString()); string errMsg = string.Empty; var rd = sheet.GetRow(DATA_HEADER_INDEX); // for (int idxHead = 0; idxHead < headers.Count; idxHead++) { errMsg = errMsg + _checkDataSheetKeyValidity(sheet, headers, headers[idxHead].FieldName); } if (!String.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } } // data private static string _checkDataSheetKeyValidity(ISheet sheet, List headers, string key) { string errMsg = string.Empty; int idx = headers.FindIndex(item => item.FieldName.Equals(key)); if (idx != -1) { var fieldType = headers[idx].FieldType; var fieldIndex = headers[idx].FieldIndex; var cellList = _getAllCellByIndex(sheet, fieldIndex); for (int idxCell = 0; idxCell < cellList.Count; idxCell++) { var cell = cellList[idxCell]; var cType = cell.CellType; bool isErr = false; //Log.Msg("index:【{0},{1}】headType:【{2}】cellType:【{3}】toStr:【{4}】", fieldIndex, idxCell, fieldType, cType, _convertCellToString(cell)); // (TEST) if (cType == CellType.Blank) { continue; } switch (fieldType) { case "int": if ((cType != CellType.Numeric) || (cType == CellType.Numeric && !StrRegex.IsInteger(cell.NumericCellValue.ToString()))) { isErr = true; } break; case "double": if ((cType != CellType.Numeric) || (cType == CellType.Numeric && !StrRegex.IsNumber(cell.NumericCellValue.ToString()))) { isErr = true; } break; case "string": //if (cType != CellType.String) //{ // isErr = true; //} break; case "formula": if (cType != CellType.Formula) { isErr = true; } break; case "bool": if (cType != CellType.Boolean) { isErr = true; } break; default: isErr = true; break; } if (isErr == true) { errMsg = errMsg + string.Format(" Data [{0},{1}]={3} ExcelExport {2}
", _sheetNumToEng(fieldIndex), idxCell + DEF_HEADER_INDEX + 3, fieldType, _convertCellToString(cell)); } } } else { errMsg = errMsg + string.Format(" Data {0}
", key); } return errMsg; } // data private static void _checkDataSheetKeyUnique(ISheet sheet, List headers, string key) { string errMsg = string.Empty; int idx = headers.FindIndex(item => item.FieldName.Equals(key)); if (idx != -1) { var ids = new HashSet(); var cellList = _getAllCellByIndex(sheet, headers[idx].FieldIndex); for (int idxCell = 0; idxCell < cellList.Count; idxCell++) { var cell = cellList[idxCell]; var idKey = _convertCellToString(cell); if (String.IsNullOrEmpty(idKey)) { errMsg = errMsg + string.Format(" Data Id {0}
", idxCell + DEF_HEADER_INDEX + 3); } else if (ids.Contains(idKey)) { errMsg = errMsg + string.Format(" Data Id {0} :{1}
", idxCell + DEF_HEADER_INDEX + 3, idKey); } ids.Add(idKey); } } else { errMsg = errMsg + string.Format(" Data {0}
", key); } if (!String.IsNullOrEmpty(errMsg)) { throw new Exception(errMsg); } } // Data private static void _readDataSheet(ISheet sheet, List headers, List rows) { // Data for (int idxRow = DATA_DATA_INDEX; idxRow <= sheet.LastRowNum; idxRow++) { var rd = sheet.GetRow(idxRow); var ds = new List(); for (int idxHead = 0; idxHead < headers.Count; idxHead++) { var val = _convertCellToString(rd.GetCell(headers[idxHead].FieldIndex)); ds.Add(val); } // excelRow rows.Add(new TableExcelRow() { StrList = ds }); } } // private static string _sheetNumToEng(int idx) { var cur = idx + 1 + 64; string rowIex = string.Empty; if (65 <= cur && cur <= 90) { byte[] btNumber = new byte[] { (byte)cur }; System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding(); rowIex = asciiEncoding.GetString(btNumber); } else { rowIex = (idx + 1).ToString(); } return rowIex; } // , Data private static List _getAllCellByIndex(ISheet sheet, int index) { var list = new List(); for (int i = DATA_DATA_INDEX; i <= sheet.LastRowNum; i++) { var rd = sheet.GetRow(i); // NULL , if (rd.GetCell(index) == null) { rd.CreateCell(index, CellType.Blank); } list.Add(rd.GetCell(index)); } return list; } // String private static string _convertCellToString(ICell cell) { string r = string.Empty; if (cell != null) { switch (cell.CellType) { // case CellType.Boolean: r = cell.BooleanCellValue.ToString(); break; // case CellType.Numeric: r = cell.NumericCellValue.ToString(); break; // case CellType.Formula: r = cell.NumericCellValue.ToString(); break; // String default: r = cell.StringCellValue; break; } } return r; } } }

프로젝트 다운로드 링크:https://download.csdn.net/download/Le_Sam/12822484

좋은 웹페이지 즐겨찾기