using Furion; using Furion.FriendlyException; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Threading.Tasks; using Vote.Services.Dto; namespace Vote.Services.Tools { /// /// /// public static class ExcelHelper { static ExcelHelper() { System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); } /// /// 判断是否为兼容模式 /// /// /// public static bool GetIsCompatible(string filePath) { return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase); } /// /// 创建工作薄 /// /// /// public static IWorkbook CreateWorkbook(bool isCompatible) { if (isCompatible) { return new HSSFWorkbook(); } else { return new XSSFWorkbook(); } } /// /// 创建工作薄(依据文件流) /// /// /// /// public static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream) { if (isCompatible) { return new HSSFWorkbook(stream); } else { return new XSSFWorkbook(stream); } } /// /// 列名字母转索引 /// /// /// public static int ToExcelColumnIndex(this string columnName) { if (!Regex.IsMatch(columnName.ToUpper(), @"[A-Z]+")) { throw new Exception("invalid parameter"); } int index = 0; char[] chars = columnName.ToUpper().ToCharArray(); for (int i = 0; i < chars.Length; i++) { index += ((int)chars[i] - (int)'A' + 1) * (int)Math.Pow(26, chars.Length - i - 1); } return index - 1; } /// /// 列索引转字母 /// /// /// public static string ToExcelColumnName(this int index) { if (index < 0) { throw new Exception("invalid parameter"); } List chars = new List(); do { if (chars.Count > 0) index--; chars.Insert(0, ((char)(index % 26 + (int)'A')).ToString()); index = (int)((index - index % 26) / 26); } while (index > 0); return String.Join(string.Empty, chars.ToArray()); } private static List GetDataByType(List list, Entities.EnumProjectType type) { return list.Where(a => a.type == type).ToList(); } /// /// /// /// public static string WriteTemplate(List list, int start_row, string start_column) { try { string template_name = "2021年度甬江杯投票.xlsx"; string excelFilePath = $"{App.WebHostEnvironment.WebRootPath}\\ExcelTemplate\\{template_name}"; string outputPath = string.Empty; if (!string.IsNullOrEmpty(excelFilePath)) { using (FileStream excelFileStream = System.IO.File.OpenRead(excelFilePath)) { bool isCompatible = ExcelHelper.GetIsCompatible(excelFilePath); IWorkbook workbook = ExcelHelper.CreateWorkbook(isCompatible, excelFileStream); ISheet sheet = null; sheet = workbook.GetSheetAt(1); Dictionary dic_sheet_config = new Dictionary(); var data = GetDataByType(list, Entities.EnumProjectType.FangJian); //从第几行开始 , 比如 行号是4 , 就写3 var startRowIndex = start_row - 1; for (int i = 0; i < data.Count; i++) { var c_rowindex = startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var length0 = data.Count; data = GetDataByType(list, Entities.EnumProjectType.ShiZheng); for (int i = 0; i < data.Count; i++) { var c_rowindex = length0 + 1 + startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var length1 = data.Count; data = GetDataByType(list, Entities.EnumProjectType.GuiDaoGongCheng); for (int i = 0; i < data.Count; i++) { var c_rowindex = length0 + 1 + length1 + 1 + startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var length2 = data.Count; data = GetDataByType(list, Entities.EnumProjectType.DianLiGongCheng); for (int i = 0; i < data.Count; i++) { var c_rowindex = length0 + 1 + length1 + 1 + length2 + 1 + startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var length3 = data.Count; data = GetDataByType(list, Entities.EnumProjectType.JiaoTongGongCheng); for (int i = 0; i < data.Count; i++) { var c_rowindex = length0 + 1 + length1 + 1 + length2 + 1 + length3 + 1 + startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var length4 = data.Count; data = GetDataByType(list, Entities.EnumProjectType.ShuiLiGongCheng); for (int i = 0; i < data.Count; i++) { var c_rowindex = length0 + 1 + length1 + 1 + length2 + 1 + length3 + 1 + length4 + 1 + startRowIndex + i; int cell_start_index = start_column.ToExcelColumnIndex(); sheet.GetRow(c_rowindex).GetCell(cell_start_index).SetCellValue(data[i].no_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 1).SetCellValue(data[i].yes_count); sheet.GetRow(c_rowindex).GetCell(cell_start_index + 2).SetCellValue(data[i].is_agree ? "通过" : "不通过"); } var file = new FileInfo(excelFilePath); var savePath = file.DirectoryName + "\\OutPut\\"; if (!Directory.Exists(savePath)) Directory.CreateDirectory(savePath); outputPath = savePath + DateTime.Now.ToString("yyyyMMddHHmmss") + "-" + template_name; using (var filess = new FileStream(outputPath, FileMode.Create, FileAccess.Write, FileShare.Read)) { workbook.Write(filess); } } } return outputPath; } catch (System.IO.IOException ioex) { throw Oops.Oh("文件被占用,请检查文件模板"); } } } }