NPOI 的使用姿式

NPOI 正確的使用姿式

主要是須要注意公式和日期類型的單元格的讀取。lua

/// <summary>
        /// 打開指定 Excel 文件
        /// </summary>
        /// <param name="fileName">指定要打開的文件名</param>
        /// <returns>Excel 文件對應的單元格</returns>
        internal ExcelDataGrid Open(string fileName)
        {
            if (string.IsNullOrWhiteSpace(fileName))
            {
                throw new ArgumentNullException(nameof(fileName));
            }
            var sourceFs = new FileStream(fileName, FileMode.Open, FileAccess.Read);
            var extensions = new FileInfo(fileName).Extension;
            IWorkbook workbook = null;
            IFormulaEvaluator evaluator = null;
            if (extensions.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase))
            {
                workbook = new XSSFWorkbook(sourceFs);
                evaluator = new XSSFFormulaEvaluator(workbook);
            }
            else if (extensions.Equals(".xls", StringComparison.CurrentCultureIgnoreCase))
            {
                workbook = new HSSFWorkbook(sourceFs);
                evaluator = new HSSFFormulaEvaluator(workbook);
            }
            else
            {
                throw new ArgumentException("不支持的文件擴展名");
            }
            var sheet = workbook.GetSheetAt(0);

            var result = new ExcelDataGrid();
            var rowIndex = -1;
            var columnIndex = -1;
            foreach (var row in GetRows(sheet))
            {
                rowIndex++;
                columnIndex = -1;
                foreach (var column in row.Cells)
                {
                    columnIndex++;
                    result[rowIndex, columnIndex] = GetCellValue(evaluator, column);
                }
            }
            sourceFs.Close();
            workbook.Close();
            return result;
        }
/// <summary>
        /// 獲取<see cref="ISheet"/>中的行
        /// </summary>
        /// <param name="sheet">指定獲取的<see cref="ISheet"/>實例</param>
        /// <returns><see cref="ISheet"/>中的行</returns>
        private IEnumerable<IRow> GetRows(ISheet sheet)
        {
            if (sheet == null)
            {
                throw new ArgumentNullException(nameof(sheet));
            }

            var enumerator = sheet.GetEnumerator();
            while (enumerator.MoveNext())
            {
                yield return enumerator.Current as IRow;
            }
        }
/// <summary>
        /// 獲取單元格的顯示值
        /// </summary>
        /// <param name="evaluator">單元格公式計算器</param>
        /// <param name="cell">單元格</param>
        /// <returns>單元格顯示的值</returns>
        private string GetCellValue(IFormulaEvaluator evaluator, ICell cell)
        {
            switch (cell.CellType)
            {
                case CellType.Blank:
                    return string.Empty;
                case CellType.Boolean:
                    return cell.BooleanCellValue.ToString();
                case CellType.Error:
                    return cell.ErrorCellValue.ToString();
                case CellType.Formula:
                    cell = evaluator.EvaluateInCell(cell);
                    return GetCellValue(evaluator, cell);
                case CellType.Numeric:
                    if (DateUtil.IsCellDateFormatted(cell))
                        return cell.DateCellValue.ToString();
                    else
                        return cell.NumericCellValue.ToString();
                case CellType.String:
                    return cell.StringCellValue;
                case CellType.Unknown:
                    return "Unknow";
                default:
                    return "";
            }
        }
相關文章
相關標籤/搜索