Commit 2eaef9e0 by lcx

添加样式

parent 157f5009
using NPOI.HSSF.Util;
using NPOI.SS.UserModel;
using System;
using System.Collections.Generic;
using System.Text;
namespace Performance.Services.ExtractExcelService
{
public class ExcelStyle
{
private IWorkbook workbook;
public ExcelStyle(IWorkbook workbook)
{
this.workbook = workbook ?? throw new ArgumentNullException(nameof(IWorkbook));
}
public ICellStyle GetEmptyCellStyle()
{
return workbook.CreateCellStyle();
}
public ICellStyle GetCellStyle()
{
ICellStyle cellStyle = workbook.CreateCellStyle();
SetFont(cellStyle);
SetBorder(cellStyle);
SetAlignment(cellStyle);
return cellStyle;
}
public void SetFont(ICellStyle cellStyle, short fontSize = 11, string fontName = "微软雅黑", short fontColor = HSSFColor.Black.Index)
{
//字体
IFont font = workbook.CreateFont();
font.FontHeightInPoints = fontSize;
font.FontName = fontName;
font.Color = fontColor;
cellStyle.SetFont(font);
}
public void SetBorder(ICellStyle cellStyle, BorderStyle borderStyle = BorderStyle.Thin, short borderColor = HSSFColor.Black.Index)
{
//边框
cellStyle.BorderBottom = borderStyle;
cellStyle.BorderLeft = borderStyle;
cellStyle.BorderRight = borderStyle;
cellStyle.BorderTop = borderStyle;
//边框颜色
cellStyle.BottomBorderColor = borderColor;
cellStyle.TopBorderColor = borderColor;
cellStyle.LeftBorderColor = borderColor;
cellStyle.RightBorderColor = borderColor;
}
public void SetAlignment(ICellStyle cellStyle, HorizontalAlignment horizontal = HorizontalAlignment.Center, VerticalAlignment vertical = VerticalAlignment.Center)
{
//水平居中
cellStyle.Alignment = horizontal;
//垂直居中
cellStyle.VerticalAlignment = vertical;
}
public void SetBackgroundColor(ICellStyle cellStyle, short foregroundColor)
{
cellStyle.FillForegroundColor = foregroundColor;
cellStyle.FillPattern = FillPattern.SolidForeground;
}
public ICellStyle SetBgkColorAndFormat(ICellStyle cellStyle, StyleType type = StyleType.默认, CellFormat format = CellFormat.默认)
{
SetBackgroundColor(cellStyle, type);
if (format != CellFormat.默认) SetDataFormat(cellStyle, format);
return cellStyle;
}
private void SetBackgroundColor(ICellStyle cellStyle, StyleType type)
{
switch (type)
{
case StyleType.列头:
cellStyle.FillForegroundColor = HSSFColor.Gold.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
break;
case StyleType.系数:
cellStyle.FillForegroundColor = HSSFColor.Green.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
break;
case StyleType.数据:
cellStyle.FillForegroundColor = HSSFColor.SkyBlue.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
break;
case StyleType.Remove:
cellStyle.FillForegroundColor = HSSFColor.Orange.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
break;
case StyleType.默认:
default:
cellStyle.FillForegroundColor = HSSFColor.White.Index;
cellStyle.FillPattern = FillPattern.SolidForeground;
break;
}
}
private void SetDataFormat(ICellStyle cellStyle, CellFormat format)
{
IDataFormat datastyle = workbook.CreateDataFormat();
switch (format)
{
case CellFormat.时间:
cellStyle.DataFormat = datastyle.GetFormat("yyyy/mm/dd");
break;
case CellFormat.数字:
cellStyle.DataFormat = datastyle.GetFormat("0");
break;
case CellFormat.数字2:
cellStyle.DataFormat = datastyle.GetFormat("0.00");
break;
case CellFormat.百分比:
cellStyle.DataFormat = datastyle.GetFormat("0%");
break;
case CellFormat.百分比2:
cellStyle.DataFormat = datastyle.GetFormat("0.00%");
break;
case CellFormat.默认:
default:
break;
}
}
}
}
......@@ -16,7 +16,7 @@ public enum UnitType
医技组
}
public static void WriteSheetHeader(ISheet sheet, PerSheetPoint point, SheetType sheetType, List<ExcelHeader> headers)
public static void WriteSheetHeader(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, List<ExcelHeader> headers)
{
if (headers == null || !headers.Any()) return;
......@@ -47,47 +47,56 @@ public static void WriteSheetHeader(ISheet sheet, PerSheetPoint point, SheetType
}
if (columns == null || !columns.Any()) return;
var factorStyle = sheetType == SheetType.Workload
? style.SetBgkColorAndFormat(style.GetCellStyle(), StyleType.系数, CellFormat.数字)
: style.SetBgkColorAndFormat(style.GetCellStyle(), StyleType.系数, CellFormat.百分比);
var columnStyle = style.SetBgkColorAndFormat(style.GetCellStyle(), StyleType.列头);
// 补充excel中不存在的列
foreach (var item in columns)
{
var columnCell = columnHeader.GetOrCreate(headerFirstCellNum);
columnCell.SetCellValue(item.ColumnName);
columnCell.CellStyle = columnStyle;
if (sheetType == SheetType.Workload)
{
var workloadCell = workloadFactor.GetOrCreate(headerFirstCellNum);
workloadCell.SetCellOValue(item.WorkloadFactor);
workloadCell.CellStyle = factorStyle;
}
else
{
var doctorCell = doctorFactor.GetOrCreate(headerFirstCellNum);
doctorCell.SetCellOValue(item.DoctorFactor);
doctorCell.CellStyle = factorStyle;
var nurseCell = nurseFactor.GetOrCreate(headerFirstCellNum);
nurseCell.SetCellOValue(item.NurseFactor);
nurseCell.CellStyle = factorStyle;
var technicianCell = technicianFactor.GetOrCreate(headerFirstCellNum);
technicianCell.SetCellOValue(item.TechnicianFactor);
technicianCell.CellStyle = factorStyle;
}
headerFirstCellNum++;
}
}
public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, List<string> headers, List<ExtractTransDto> data)
public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, List<string> headers, List<ExtractTransDto> data)
{
var columnHeader = sheet.GetOrCreate(point.HeaderFirstRowNum.Value);
int dataFirstRowNum = point.DataFirstRowNum.Value;
WriteSheetDataExistent(sheet, columnHeader, point, sheetType, headers, data, ref dataFirstRowNum);
WriteSheetDataExistent(sheet, columnHeader, point, sheetType, style, headers, data, ref dataFirstRowNum);
if (data == null || !data.Any(t => !string.IsNullOrEmpty(t.Department))) return;
WriteSheetDataNonexistent(sheet, columnHeader, point, sheetType, headers, data, dataFirstRowNum);
WriteSheetDataNonexistent(sheet, columnHeader, point, sheetType, style, headers, data, dataFirstRowNum);
}
private static void WriteSheetDataExistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType,
private static void WriteSheetDataExistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType, ExcelStyle style,
List<string> headers, List<ExtractTransDto> data, ref int dataFirstRowNum)
{
if (sheet.LastRowNum > dataFirstRowNum)
......@@ -133,7 +142,7 @@ public static void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType s
}
}
private static void WriteSheetDataNonexistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType,
private static void WriteSheetDataNonexistent(ISheet sheet, IRow columnHeader, PerSheetPoint point, SheetType sheetType, ExcelStyle style,
List<string> headers, List<ExtractTransDto> data, int dataFirstRowNum)
{
var departments = data.Select(s => s.Department).Where(w => !string.IsNullOrEmpty(w)).Distinct().ToList();
......
using Microsoft.Extensions.Logging;
using NPOI.SS.UserModel;
using Performance.DtoModels;
using Performance.EntityModels;
using Performance.Infrastructure;
......@@ -98,7 +99,10 @@ private void WriteDataToFile(string templateFile, string extractFile, Dictionary
var workbook = ExcelHelper.GetWorkbook(templateFile);
if (workbook == null) throw new PerformanceException("文件读取失败");
ExtractHelper.CreateNotExistSheet(new List<ex_module>(), workbook);
ExcelStyle style = new ExcelStyle(workbook);
var models = exdict[ExDataDict.ExModule] as List<ex_module>;
ExtractHelper.CreateNotExistSheet(models, workbook);
WriteDataFactory factory = new WriteDataFactory();
for (int sheetIndex = 0; sheetIndex < workbook.NumberOfSheets; sheetIndex++)
......@@ -114,7 +118,7 @@ private void WriteDataToFile(string templateFile, string extractFile, Dictionary
if (customer != null)
{
var data = extractDto.Where(t => t.SheetName.NoBlank() == sheet.SheetName.NoBlank())?.ToList();
customer.WriteSheetData(sheet, point, sheetType, data, exdict);
customer.WriteSheetData(sheet, point, sheetType, style, data, exdict);
}
}
......
......@@ -8,7 +8,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
class AccountBasicDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
throw new NotImplementedException();
}
......
......@@ -8,7 +8,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
class ClinicEmployeeDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
throw new NotImplementedException();
}
......
......@@ -10,7 +10,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public class EmployeeDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict)
{
if (data is List<per_employee> employees && employees.Any(t => accountingUnits.Contains(t.UnitType)))
{
......
......@@ -8,6 +8,6 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public interface ISheetDataWrite
{
void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null);
void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null);
}
}
......@@ -10,7 +10,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public class IncomeDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
var modules = exdict[ExDataDict.ExModule] as List<ex_module>;
var module = modules?.FirstOrDefault(t => t.SheetType == (int)sheetType && t.ModuleName.NoBlank() == sheet.SheetName.NoBlank());
......@@ -28,11 +28,11 @@ public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetTyp
TechnicianFactor = t.FactorValue3 ?? 0
}).ToList();
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, headers);
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, style, headers);
if (data is List<ExtractTransDto> extractDto && extractDto.Any())
{
var columns = headers.Select(t => t.ColumnName).ToList();
WriteDataHelper.WriteSheetData(sheet, point, sheetType, columns, extractDto);
WriteDataHelper.WriteSheetData(sheet, point, sheetType, style, columns, extractDto);
}
}
}
......
......@@ -10,7 +10,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public class OtherIncomeDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
var modules = exdict[ExDataDict.ExModule] as List<ex_module>;
var module = modules?.FirstOrDefault(t => t.SheetType == (int)sheetType && t.ModuleName.NoBlank() == sheet.SheetName.NoBlank());
......@@ -28,11 +28,11 @@ public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetTyp
TechnicianFactor = t.FactorValue3 ?? 0
}).ToList();
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, headers);
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, style, headers);
if (data is List<ExtractTransDto> extractDto && extractDto.Any())
{
var columns = headers.Select(t => t.ColumnName).ToList();
WriteDataHelper.WriteSheetData(sheet, point, sheetType, columns, extractDto);
WriteDataHelper.WriteSheetData(sheet, point, sheetType, style, columns, extractDto);
}
}
}
......
......@@ -8,7 +8,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
class SpecialUnitDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
throw new NotImplementedException();
}
......
......@@ -10,7 +10,7 @@ namespace Performance.Services.ExtractExcelService.SheetDataWrite
{
public class WorkloadDataWrite : ISheetDataWrite
{
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, object data, Dictionary<ExDataDict, object> exdict = null)
public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetType, ExcelStyle style, object data, Dictionary<ExDataDict, object> exdict = null)
{
var modules = exdict[ExDataDict.ExModule] as List<ex_module>;
var module = modules?.FirstOrDefault(t => t.SheetType == (int)sheetType && t.ModuleName.NoBlank() == sheet.SheetName.NoBlank());
......@@ -26,11 +26,11 @@ public void WriteSheetData(ISheet sheet, PerSheetPoint point, SheetType sheetTyp
WorkloadFactor = t.FactorValue1 ?? 0
}).ToList();
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, headers);
WriteDataHelper.WriteSheetHeader(sheet, point, sheetType, style, headers);
if (data is List<ExtractTransDto> extractDto && extractDto.Any())
{
var columns = headers.Select(t => t.ColumnName).Intersect(extractDto.Select(t => t.Category))?.ToList();
WriteDataHelper.WriteSheetData(sheet, point, sheetType, columns, extractDto);
WriteDataHelper.WriteSheetData(sheet, point, sheetType, style, columns, extractDto);
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment