Commit 7e963c28 by lcx

特殊科室合并新增项

parent c447d46c
......@@ -1271,12 +1271,9 @@ private void WriteSpecialUnit(ISheet sheet, IPerSheetDataRead sheetRead, List<ex
allotDataList = perforImspecialunitRepository.GetEntities(t => t.AllotID == lastAllot.ID);
//取消合并单元格
int mergedCount = sheet.NumMergedRegions;
for (int i = mergedCount - 1; i >= 0; i--)
foreach (var merge in sheet.MergedRegions)
{
var temp = sheet.GetMergedRegion(i);
if (temp.FirstRow > sheetRead.Point.HeaderFirstRowNum)
sheet.RemoveMergedRegion(i);
sheet.RemoveMergedRegion(sheet.MergedRegions.IndexOf(merge));
}
var modDataGroup = speaialList.GroupBy(t => new { t.Department }).Select(group => new
......@@ -1340,6 +1337,139 @@ private void WriteSpecialUnit(ISheet sheet, IPerSheetDataRead sheetRead, List<ex
logger.LogInformation($"{sheet.SheetName}写入结束.");
}
private void SupplySpecialUnit(ISheet sheet, IPerSheetDataRead sheetRead, List<ex_special> specials, List<NewExtractDto> data, per_allot lastAllot = null, bool IsWriteHead = true)
{
logger.LogInformation($"{sheet.SheetName}开始执行写入.");
var speaialList = specials?.OrderBy(t => t.Department).ToList();
logger.LogInformation($"item有{speaialList?.Count ?? 0}个.");
if (speaialList == null || !speaialList.Any()) return;
var headIndex = sheetRead.Point.HeaderFirstRowNum;
var cellList = sheet.GetRow(headIndex.Value).Cells;
var headerDict = new Dictionary<string, int>();
cellList.ForEach(t =>
{
t.SetCellType(CellType.String);
if (!headerDict.ContainsKey(t.StringCellValue))
headerDict.Add(t.StringCellValue, cellList.IndexOf(t));
});
if (!headerDict.ContainsKey("科室") || !headerDict.ContainsKey("量化指标")) return;
var merges = mergefunc.Invoke(sheet, sheetRead.Point.DataFirstRowNum);
if (merges == null || !merges.Any()) return;
merges = merges.OrderBy(t => t.FirstRow).ToList();
int startRowIndex = sheetRead.Point.DataFirstRowNum ?? 2;
foreach (var merge in merges)
{
var deptSpecials = speaialList.Where(t => t.Department == merge.Value)?.ToList();
if (deptSpecials == null) continue;
for (int i = merge.FirstRow; i < merge.LastRow + 1; i++)
{
var row = GetOrCreate(sheet, i);
string target = NopiSevice.GetValue(GetOrCreate(row, headerDict["量化指标"]));
var config = deptSpecials.FirstOrDefault(t => t.Target == target);
if (config != null)
{
deptSpecials.RemoveAll(t => t.Department == merge.Value && t.Target == target);
continue;
}
}
if (deptSpecials != null && deptSpecials.Any())
{
sheet.ShiftRows(merge.LastRow + 1, sheet.LastRowNum, 1, true, false);
var shiftrow = sheet.CreateRow(merge.LastRow + 1);
var thanmerges = merges.Where(t => t.FirstRow > merge.LastRow)?.ToList();
if (thanmerges != null && thanmerges.Any())
{
thanmerges.ForEach(t =>
{
t.FirstRow += 1;
t.LastRow += 1;
});
}
merge.LastRow += 1;
}
speaialList.RemoveAll(t => t.Department == merge.Value);
}
if (speaialList != null && speaialList.Any())
{
var index = sheet.LastRowNum + 1;
foreach (var item in speaialList)
{
var newrow = sheet.CreateRow(index);
newrow.CreateCell(0).SetCellValue("");
index++;
}
}
//取消合并单元格
foreach (var merge in sheet.MergedRegions)
{
sheet.RemoveMergedRegion(sheet.MergedRegions.IndexOf(merge));
}
foreach (var merge in merges)
{
if (merge.LastRow > merge.FirstRow || merge.LastColumn > merge.FirstColumn)
{
CellRangeAddress region = new CellRangeAddress(merge.FirstRow, merge.LastRow, merge.FirstColumn, merge.LastColumn);
sheet.AddMergedRegion(region);
}
}
}
private readonly Func<ISheet, int?, List<CellRangeAddressAndValue>> mergefunc = (sheet, beginrow) =>
{
var merges = new List<CellRangeAddressAndValue>();
//合并
int regionsCount = sheet.NumMergedRegions;
for (int i = 0; i < regionsCount; i++)
{
CellRangeAddress range = sheet.GetMergedRegion(i);
if (range != null)
{
var merge = new CellRangeAddressAndValue(range);
string value = "";
var firstrow = sheet.GetRow(range.FirstRow);
if (firstrow != null && firstrow.GetCell(range.FirstColumn) is ICell firstcell && firstcell != null)
{
firstcell.SetCellType(CellType.String);
value = firstcell.StringCellValue;
}
merge.Value = value;
merges.Add(merge);
}
}
//非合并
int index = beginrow ?? merges.Min(t => t.FirstRow);
for (int i = index; i < sheet.LastRowNum + 1; i++)
{
if (!merges.Any(t => i >= t.FirstRow && i <= t.LastRow))
{
string value = "";
var firstrow = sheet.GetRow(i);
if (firstrow != null && firstrow.GetCell(merges.First().FirstColumn) is ICell firstcell && firstcell != null)
{
firstcell.SetCellType(CellType.String);
value = firstcell.StringCellValue;
}
merges.Add(new CellRangeAddressAndValue(i, i, merges.First().FirstColumn, merges.First().LastColumn, value, false));
}
}
return merges;
};
#region 写入数据
/// <summary>
/// 写入列头
......@@ -1835,4 +1965,52 @@ public class NewExtractDto : ExtractDto
public string InpatTechnicAccounting { get; set; }
public new decimal? Value { get; set; }
}
public class CellRangeAddressAndValue
{
public CellRangeAddressAndValue()
: this(default, default, default, default, default)
{
}
public CellRangeAddressAndValue(CellRangeAddress address)
: this(address.FirstRow, address.LastRow, address.FirstColumn, address.LastColumn)
{
}
public CellRangeAddressAndValue(int firstRow, int lastRow, int firstCol, int lastCol)
: this(firstRow, lastRow, firstCol, lastCol, default)
{
}
public CellRangeAddressAndValue(int firstRow, int lastRow, int firstCol, int lastCol, string value, bool isMerge = true)
{
if (lastRow < firstRow || lastCol < firstCol)
{
throw new ArgumentException("lastRow < firstRow || lastCol < firstCol");
}
FirstRow = firstRow;
LastRow = lastRow;
FirstColumn = firstCol;
LastColumn = lastCol;
Value = value;
IsMerge = isMerge;
}
public int FirstRow { get; set; }
public int LastRow { get; set; }
public int FirstColumn { get; set; }
public int LastColumn { get; set; }
public string Value { get; set; }
public bool IsMerge { get; set; }
}
}
......@@ -12,8 +12,8 @@
<ItemGroup>
<PackageReference Include="CSRedisCore" Version="3.0.45" />
<PackageReference Include="DotNetCore.NPOI" Version="1.2.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.1.0" />
<PackageReference Include="NPOI" Version="2.5.1" />
</ItemGroup>
<ItemGroup>
......
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