森林草原湿地荒漠调查
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

466 lines
21 KiB

using System;
using System.Collections.Generic;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using KGIS.Framework.Platform;
using System.IO;
using KGIS.Framework.Utils.ExtensionMethod;
using HorizontalAlignment = NPOI.SS.UserModel.HorizontalAlignment;
using FileStream = System.IO.FileStream;
namespace Kingo.PluginServiceInterface.Helper.NPOIHelper
{
/// <summary>
/// NPOI表格操作帮助类
/// </summary>
public class NPOIExcelHelper
{
/// <summary>
/// 临时模板中的数据导入到指定文件夹内(有序创建)
/// </summary>
/// <param name="XSSTempPath">临时表格路径</param>
/// <param name="XSSPath">自定义导出路径</param>
/// <param name="ViewTableTemp">数据表</param>
/// <param name="dicList">权属字典集合</param>
public static void WriteExcelToXLSX(string XSSTempPath, string XSSPath, DataTable ViewTableTemp, List<DataDicTionary> dicList)
{
try
{
FileStream FileStream = new FileStream(XSSTempPath, FileMode.Open, FileAccess.ReadWrite);
IWorkbook workbook = new XSSFWorkbook(FileStream);
ISheet sheet = workbook.GetSheetAt(0);
var style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
style.BorderBottom = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
if (ViewTableTemp == null || ViewTableTemp.Rows.Count == 0 || dicList == null)
return;
DataColumnCollection fields = ViewTableTemp.Columns;
for (int i = 0; i < ViewTableTemp.Rows.Count; i++)
{
IRow row1 = sheet.CreateRow(i + 6);
for (int j = 0; j < fields.Count; j++)
{
ICell cell = row1.CreateCell(j + 1);
cell.CellStyle = style;
cell.SetCellValue(ViewTableTemp.Rows[i][fields[j]].ToDouble());
}
}
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
using (FileStream fs = new FileStream(XSSPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
byte[] b = ms.ToArray();
fs.Write(b, 0, b.Length);
ms.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 自定义表格数据(无序创建)
/// </summary>
/// <param name="XSSTempPath">临时表格路径</param>
/// <param name="XSSPath">自定义导出路径</param>
/// <param name="ViewTableTemp">数据表</param>
public static void WriteExcelToXLSX(string XSSTempPath, string XSSPath, DataTable ViewTableTemp)
{
try
{
FileStream FileStream = new FileStream(XSSTempPath, FileMode.Open, FileAccess.ReadWrite);
IWorkbook workbook = new XSSFWorkbook(FileStream);
ISheet sheet = workbook.GetSheetAt(0);
var style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
style.VerticalAlignment = VerticalAlignment.Center;
style.BorderBottom = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
IFont headerFont = workbook.CreateFont();
headerFont.FontName = "宋体";
headerFont.FontHeightInPoints = 10;
style.SetFont(headerFont);
if (ViewTableTemp == null || ViewTableTemp.Rows.Count == 0)
return;
DataColumnCollection fields = ViewTableTemp.Columns;
foreach (DataRow row in ViewTableTemp.Rows)
{
var x = Convert.ToInt32(row["Cells_X"]);
var y = Convert.ToInt32(row["Cells_Y"]);
var value = row["BGMJ"].ToDouble();
if (sheet.GetRow(x) != null)
{
IRow row1 = sheet.GetRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
else
{
IRow row1 = sheet.CreateRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
}
//执行计算公式
ICreationHelper creationHelper = workbook.GetCreationHelper();
var evaluator = creationHelper.CreateFormulaEvaluator();
evaluator?.EvaluateAll();
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
using (FileStream fs = new FileStream(XSSPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
byte[] b = ms.ToArray();
fs.Write(b, 0, b.Length);
ms.Close();
}
}
catch (Exception ex)
{
throw ex;
}
}
/// <summary>
/// 村级土地利用表导出_主表数据(无序创建)
/// </summary>
/// <param name="XSSTempPath">临时表格路径</param>
/// <param name="XSSPath">自定义导出路径</param>
/// <param name="ViewTableTemp">数据表</param>
public static void WriteExcelToXLSX(ref IWorkbook workbook, DataTable ViewTableTemp, string XSSPath = "")
{
try
{
ISheet sheet = workbook.GetSheetAt(0);
var style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
style.BorderBottom = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
if (ViewTableTemp == null || ViewTableTemp.Rows.Count == 0)
return;
foreach (DataRow row in ViewTableTemp.Rows)
{
var x = Convert.ToInt32(row["Cells_X"]);
var y = Convert.ToInt32(row["Cells_Y"]);
var value = row["BGMJ"].ToDouble();
if (sheet.GetRow(x) != null)
{
IRow row1 = sheet.GetRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
else
{
IRow row1 = sheet.CreateRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
}
//执行计算公式
ICreationHelper creationHelper = workbook.GetCreationHelper();
var evaluator = creationHelper.CreateFormulaEvaluator();
evaluator?.EvaluateAll();
if (!string.IsNullOrWhiteSpace(XSSPath))
{ //根据需要进行保存,并非每一次进行数据插入,必须另存为
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
using (FileStream fs = new FileStream(XSSPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
byte[] b = ms.ToArray();
fs.Write(b, 0, b.Length);
ms.Close();
}
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("方法:WriteExcelToXLSX 执行异常", ex);
throw ex;
}
}
//村级土地利用表导出_附表
public static void SetFileToDiskNPOI(ref IWorkbook workbook, DataTable ViewTableTemp, string CodeName, string TempCode, string XSSPath = "")
{
try
{
ISheet sheet = workbook.GetSheetAt(0);
var style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
style.BorderBottom = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
if (sheet.GetRow(0) != null)
{
IRow row1 = sheet.GetRow(0);
ICell cell = row1.CreateCell(0);
cell.CellStyle = style;
cell.SetCellValue(TempCode);
}
//NPOI.SS.Util.CellRangeAddress region = new NPOI.SS.Util.CellRangeAddress(0, 3, 0, 0);
//sheet.AddMergedRegion(region);
foreach (DataRow row in ViewTableTemp?.Rows)
{
var x = Convert.ToInt32(row["Cells_X"]);
var y = Convert.ToInt32(row["Cells_Y"]);
var value = row["BGMJ"].ToDouble();
if (sheet.GetRow(x) != null)
{
IRow row1 = sheet.GetRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
else
{
IRow row1 = sheet.CreateRow(x);
ICell cell = row1.CreateCell(y);
cell.CellStyle = style;
cell.SetCellValue(value);
}
}
//执行计算公式
ICreationHelper creationHelper = workbook.GetCreationHelper();
var evaluator = creationHelper.CreateFormulaEvaluator();
evaluator?.EvaluateAll();
if (!string.IsNullOrWhiteSpace(XSSPath))
{ //根据需要进行保存,并非每一次进行数据插入,必须另存为
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
using (FileStream fs = new FileStream(XSSPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
byte[] b = ms.ToArray();
fs.Write(b, 0, b.Length);
ms.Close();
}
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("方法:SetFileToDiskNPOI 执行异常", ex);
throw ex;
}
}
/// <summary>
/// 村级报表数据导出_主附表数据合并
/// </summary>
/// <param name="XSSTempPath">临时表格路径</param>
/// <param name="XSSPath">自定义导出路径</param>
/// <param name="ViewTableTemp">数据表</param>
/// <param name="StaIndexRow">起始行</param>
public static void WriteExcelToXLSX(ref IWorkbook workbook, List<String> stringsPath, string XSSPath = "", int StaIndexRow = 11)
{
try
{
ISheet sheet = workbook.GetSheetAt(0);
var style = workbook.CreateCellStyle();
style.Alignment = HorizontalAlignment.Center;
style.BorderBottom = BorderStyle.Thin;
style.BorderTop = BorderStyle.Thin;
style.BorderRight = BorderStyle.Thin;
style.BorderLeft = BorderStyle.Thin;
IWorkbook workbookSou = null;
foreach (var rowPath in stringsPath)
{
workbookSou = new XSSFWorkbook(rowPath);
if (workbookSou == null) continue;
ISheet sheetSou = workbookSou.GetSheetAt(0);
//执行计算公式
ICreationHelper creati = workbookSou.GetCreationHelper();
var evalor = creati.CreateFormulaEvaluator();
evalor?.EvaluateAll();
CopyWorkbookSheet(sheetSou, sheet, StaIndexRow);
StaIndexRow += sheetSou.PhysicalNumberOfRows;
}
//执行计算公式
ICreationHelper creationHelper = workbook.GetCreationHelper();
var evaluator = creationHelper.CreateFormulaEvaluator();
evaluator?.EvaluateAll();
if (!string.IsNullOrWhiteSpace(XSSPath))
{ //根据需要进行保存,并非每一次进行数据插入,必须另存为
MemoryStream ms = new MemoryStream();
workbook.Write(ms);
using (FileStream fs = new FileStream(XSSPath, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
byte[] b = ms.ToArray();
fs.Write(b, 0, b.Length);
ms.Close();
}
}
}
catch (Exception ex)
{
CommonHelper.RecordsErrLog("方法:WriteExcelToXLSX 执行异常", ex);
throw ex;
}
}
private static void CopyWorkbookSheet(ISheet sourceSheet, ISheet targetSheet, int StaIndexRow)
{
NPOI.SS.Util.CellRangeAddress region = new NPOI.SS.Util.CellRangeAddress(StaIndexRow, StaIndexRow + 3, 0, 0);
if (!targetSheet.IsMergedRegion(region))
targetSheet.AddMergedRegion(region);//合并单元格
ICellStyle cellStyle = targetSheet.Workbook.CreateCellStyle();
cellStyle.Alignment = HorizontalAlignment.Center; // 水平居中对齐
cellStyle.VerticalAlignment = VerticalAlignment.Center; // 垂直居中对齐
for (int rowIndex = 0; rowIndex <= sourceSheet.LastRowNum; rowIndex++)
{
IRow sourceRow = sourceSheet.GetRow(rowIndex);
IRow targetRow;
if (targetSheet.GetRow(rowIndex + StaIndexRow) == null)
targetRow = targetSheet.CreateRow(rowIndex + StaIndexRow);
else
targetRow = targetSheet.GetRow(rowIndex + StaIndexRow);
if (sourceRow != null)
{
for (int cellIndex = 0; cellIndex < sourceRow.LastCellNum; cellIndex++)
{
ICell sourceCell = sourceRow.GetCell(cellIndex, MissingCellPolicy.RETURN_BLANK_AS_NULL);
ICell targetCell = targetRow.CreateCell(cellIndex);
targetCell.CellStyle = cellStyle;
if (sourceCell != null)
{
switch (sourceCell.CellType)
{
case CellType.Blank:
targetCell.SetCellValue("");
break;
case CellType.Boolean:
targetCell.SetCellValue(sourceCell.BooleanCellValue);
break;
case CellType.Error:
targetCell.SetCellErrorValue(sourceCell.ErrorCellValue);
break;
case CellType.Formula:
//targetCell.SetCellFormula(""); // 清除目标单元格的公式
IFormulaEvaluator evaluator = sourceSheet.Workbook.GetCreationHelper().CreateFormulaEvaluator();
CellValue cellValue = evaluator.Evaluate(sourceCell);
targetCell.SetCellValue(cellValue.NumberValue.ToDouble(2));
break;
case CellType.Numeric:
targetCell.SetCellValue(sourceCell.NumericCellValue);
break;
case CellType.String:
targetCell.SetCellValue(sourceCell.StringCellValue);
break;
case CellType.Unknown:
default:
break;
}
}
}
}
}
}
public static void CopyWorkbookSheet(ISheet sourceSheet, ISheet targetSheet)
{
for (int rowIndex = 0; rowIndex <= sourceSheet.LastRowNum; rowIndex++)
{
IRow sourceRow = sourceSheet.GetRow(rowIndex);
IRow targetRow;
if (targetSheet.GetRow(rowIndex) == null)
targetRow = targetSheet.CreateRow(rowIndex);
else
targetRow = targetSheet.GetRow(rowIndex);
if (sourceRow != null)
{
for (int cellIndex = 0; cellIndex < sourceRow.LastCellNum; cellIndex++)
{
ICell sourceCell = sourceRow.GetCell(cellIndex, MissingCellPolicy.RETURN_BLANK_AS_NULL);
ICell targetCell = targetRow.CreateCell(cellIndex);
if (sourceCell != null)
{
switch (sourceCell.CellType)
{
case CellType.Blank:
targetCell.SetCellValue("");
break;
case CellType.Boolean:
targetCell.SetCellValue(sourceCell.BooleanCellValue);
break;
case CellType.Error:
targetCell.SetCellErrorValue(sourceCell.ErrorCellValue);
break;
case CellType.Formula:
targetCell.SetCellFormula(sourceCell.CellFormula);
break;
case CellType.Numeric:
targetCell.SetCellValue(sourceCell.NumericCellValue);
break;
case CellType.String:
targetCell.SetCellValue(sourceCell.StringCellValue);
break;
case CellType.Unknown:
default:
break;
}
}
}
}
}
}
/// <summary>
/// 获取国家报表给予的数据
/// </summary>
/// <param name="SPath">表格路径</param>
/// <param name="StartColumnIndex">自定义逻辑_开始列</param>
/// <param name="EndColumnIndex">自定义逻辑_开始列</param>
/// <returns></returns>
public static List<string> GetSheetRangValues(string SPath, int StartColumnIndex, int EndColumnIndex)
{
List<string> strings = new List<string>();
try
{
IWorkbook workbook = new XSSFWorkbook(SPath);
ISheet sheet = workbook.GetSheetAt(0);
int valueRow = 0;//获取国家数据
for (int i = 0; i < sheet.LastRowNum; i++)
{
IRow sourceRow = sheet.GetRow(i);
if (sourceRow == null)
{
continue;
}
ICell sourceCell = sourceRow.GetCell(1, MissingCellPolicy.RETURN_BLANK_AS_NULL);
if (sourceCell != null && sourceCell.ToString().ToTrim() == "名称")
{
valueRow = i + 1;
break;
}
}
IRow sourceRow2 = sheet.GetRow(valueRow);
for (int i = StartColumnIndex; i < EndColumnIndex; i++)
{
ICell sourceCell = sourceRow2.GetCell(i, MissingCellPolicy.RETURN_BLANK_AS_NULL);
strings.Add(sourceCell?.ToString());
}
return strings;
}
catch (Exception)
{
return strings;
}
}
}
}