kyy
5 天以前 4622f48ac4f89adfa48f7e79db857c198df14701
WebApi/Gs.Toolbox/ExcelHelper.cs
@@ -1,11 +1,15 @@
using System.Collections;
using System.Data;
using System.Text;
using System.Timers;
using Masuit.Tools;
using NPOI.HSSF.UserModel;
using NPOI.HSSF.Util;
using NPOI.SS.Formula.Functions;
using NPOI.SS.UserModel;
using NPOI.SS.Util;
using NPOI.XSSF.UserModel;
namespace Gs.Toolbox;
@@ -33,12 +37,12 @@
            arrColWidth[item.Ordinal] = Encoding.GetEncoding(936)
                .GetBytes(item.ColumnName).Length;
        for (var i = 0; i < dtSource.Rows.Count; i++)
        for (var j = 0; j < dtSource.Columns.Count; j++)
        {
            var intTemp = Encoding.GetEncoding(936)
                .GetBytes(dtSource.Rows[i][j].ToString()).Length;
            if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp;
        }
            for (var j = 0; j < dtSource.Columns.Count; j++)
            {
                var intTemp = Encoding.GetEncoding(936)
                    .GetBytes(dtSource.Rows[i][j].ToString()).Length;
                if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp;
            }
        var rowIndex = 0;
        foreach (DataRow row in dtSource.Rows)
@@ -182,12 +186,12 @@
                .GetBytes(item.ColumnName).Length;
        if (fixW <= 0)
            for (var i = 0; i < dtSource.Rows.Count; i++)
            for (var j = 0; j < dtSource.Columns.Count; j++)
            {
                var intTemp = Encoding.GetEncoding(936)
                    .GetBytes(dtSource.Rows[i][j].ToString()).Length;
                if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp;
            }
                for (var j = 0; j < dtSource.Columns.Count; j++)
                {
                    var intTemp = Encoding.GetEncoding(936)
                        .GetBytes(dtSource.Rows[i][j].ToString()).Length;
                    if (intTemp > arrColWidth[j]) arrColWidth[j] = intTemp;
                }
        var cusRow = sheet.CreateRow(0);
        var _rr = 0;
@@ -295,6 +299,7 @@
    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="workbook"></param>
    /// <param name="fontSize">字体大小</param>
@@ -302,68 +307,64 @@
    /// <param name="isCenter">是否中间</param>
    /// <param name="border">是否边框</param>
    /// <returns></returns>
    private static ICellStyle getStyle(HSSFWorkbook workbook,
        double fontSize = 11, bool isBold = false, bool isCenter = false,
        bool border = true)
    private static ICellStyle getStyle(HSSFWorkbook workbook, double fontSize = 11, bool isBold = false, bool isCenter = false, bool border = true)
    {
        var font = workbook.CreateFont();
        IFont font = workbook.CreateFont();
        font.FontName = "宋体";
        font.FontHeightInPoints = fontSize;
        if (isBold)
        if (isBold == true)
            font.Boldweight = (short)FontBoldWeight.Bold;
        // 创建单元格样式 - 带边框和指定字体
        var style = workbook.CreateCellStyle();
        ICellStyle style = workbook.CreateCellStyle();
        style.SetFont(font);
        if (border)
        if (border == true)
        {
            style.BorderTop = BorderStyle.Thin;
            style.BorderBottom = BorderStyle.Thin;
            style.BorderLeft = BorderStyle.Thin;
            style.BorderRight = BorderStyle.Thin;
        }
        if (isCenter)
        if (isCenter == true)
            style.Alignment = HorizontalAlignment.Center;
        style.VerticalAlignment = VerticalAlignment.Center;
        return style;
    }
    /// <summary>
    ///     设置单元格的值
    /// 设置单元格的值
    /// </summary>
    /// <param name="sheet"></param>
    /// <param name="rowIdx"></param>
    /// <param name="colIdx"></param>
    /// <param name="val"></param>
    private static void setCellVal(ISheet sheet, int rowIdx, int colIdx,
        string val)
    private static void setCellVal(ISheet sheet, int rowIdx, int colIdx, string val)
    {
        var row = sheet.GetRow(rowIdx) ?? sheet.CreateRow(rowIdx);
        var cell = row.GetCell(colIdx) ?? row.CreateCell(colIdx);
        IRow row = sheet.GetRow(rowIdx) ?? sheet.CreateRow(rowIdx);
        ICell cell = row.GetCell(colIdx) ?? row.CreateCell(colIdx);
        cell.SetCellValue(val); // 可以设置字符串、数字等类型的数据
    }
    }
    /// <summary>
    ///     生成首检
    /// 生成首检
    /// </summary>
    /// <param name="dtSource"></param>
    public static void ExportShouJian(DataSet dtSource, string strFileName)
    {
        //行高
        var rowHeight = 25;
        int rowHeight = 25;
        //总7列
        var maxCols = 7;
        int maxCols = 7;
        // 创建工作簿
        var workbook = new HSSFWorkbook();
        var sheet = workbook.CreateSheet("Sheet1");
        HSSFWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet("Sheet1");
        // 创建单元格样式 - 带边框和指定字体
        var style = getStyle(workbook);
        var styleHeader = getStyle(workbook, 20, true, true);
        var style12 = getStyle(workbook, 11, false, true);
        ICellStyle style = getStyle(workbook);
        ICellStyle styleHeader = getStyle(workbook, 20, true, true);
        ICellStyle style12 = getStyle(workbook, 11, false, true);
        // 设置列宽(6列)
        sheet.SetColumnWidth(0, 4000); // 第一列稍宽
        sheet.SetColumnWidth(0, 4000);  // 第一列稍宽
        sheet.SetColumnWidth(1, 3000);
        sheet.SetColumnWidth(2, 3000);
        sheet.SetColumnWidth(3, 3000);
@@ -371,25 +372,24 @@
        sheet.SetColumnWidth(5, 3000);
        sheet.SetColumnWidth(6, 3000);
        // 创建20行
        for (var rowIndex = 0; rowIndex <= 6; rowIndex++)
        for (int rowIndex = 0; rowIndex <= 6; rowIndex++)
        {
            var row = sheet.CreateRow(rowIndex);
            IRow row = sheet.CreateRow(rowIndex);
            // 设置行高(所有行相同高度)
            row.HeightInPoints = rowHeight;
            // 创建6个单元格
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row.CreateCell(colIndex);
                ICell cell = row.CreateCell(colIndex);
                if (rowIndex == 0)
                    cell.CellStyle = styleHeader;
                else
                    cell.CellStyle = style;
            }
        }
        //这是表头
        var tb0 = dtSource.Tables[0];
        var row0 = tb0.Rows[0];
        DataTable tb0 = dtSource.Tables[0];
        DataRow row0 = tb0.Rows[0];
        // 1. 第一行列合并
        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 6));
        // 2. 第二行列合并
@@ -424,22 +424,25 @@
        setCellVal(sheet, 5, 5, "生产日期");
        setCellVal(sheet, 5, 6, row0["scrq"].ToString());
        string[] ary = { "项目", "技术/品质要求", "测试数据", "检验结果", "A", "B", "C" };
        for (var i = 0; i < ary.Length; i++) setCellVal(sheet, 6, i, ary[i]);
        for (int i = 0; i < ary.Length; i++)
        {
            setCellVal(sheet, 6, i, ary[i]);
        }
        //从第7行开始,就是循环数据库
        var _idx = 7;
        var tb1 = dtSource.Tables[1];
        var dd = "";
        var _blPscs = false;
        var _blGjyzx = false;
        int _idx = 7;
        DataTable tb1 = dtSource.Tables[1];
        string dd = "";
        bool _blPscs = false;
        bool _blGjyzx = false;
        foreach (DataRow rrr in tb1.Rows)
        {
            //增加品水测试标题
            if (!_blPscs && rrr["项目"].ToString() == "品水测试")
            if (_blPscs == false && rrr["项目"].ToString() == "品水测试")
            {
                var row700 = sheet.CreateRow(_idx);
                for (var i = 0; i < ary.Length; i++)
                IRow row700 = sheet.CreateRow(_idx);
                for (int i = 0; i < ary.Length; i++)
                {
                    var cell700 = row700.CreateCell(i);
                    ICell cell700 = row700.CreateCell(i);
                    cell700.CellStyle = style;
                    if (i == 0)
                        cell700.SetCellValue(rrr["项目"].ToString());
@@ -452,20 +455,18 @@
                    if (i == 6)
                        cell700.SetCellValue("检验结果");
                }
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 2));
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 3, 4));
                _idx++;
                _blPscs = true;
            }
            //增加标题
            if (!_blGjyzx && rrr["项目"].ToString() == "关键部件一致性")
            if (_blGjyzx == false && rrr["项目"].ToString() == "关键部件一致性")
            {
                var row700 = sheet.CreateRow(_idx);
                for (var i = 0; i < ary.Length; i++)
                IRow row700 = sheet.CreateRow(_idx);
                for (int i = 0; i < ary.Length; i++)
                {
                    var cell700 = row700.CreateCell(i);
                    ICell cell700 = row700.CreateCell(i);
                    cell700.CellStyle = style;
                    if (i == 0)
                        cell700.SetCellValue(rrr["项目"].ToString());
@@ -482,36 +483,32 @@
                    if (i == 6)
                        cell700.SetCellValue("操作");
                }
                _idx++;
                _blGjyzx = true;
            }
            var row7 = sheet.CreateRow(_idx);
            IRow row7 = sheet.CreateRow(_idx);
            row7.HeightInPoints = rowHeight;
            var _tmphb = rrr["项目合并行数"].ToString();
            var _tmp = "";
            string _tmphb = rrr["项目合并行数"].ToString();
            string _tmp = "";
            if (dd == rrr["项目"].ToString())
                _tmp = "";
            else
                _tmp = rrr["项目"].ToString();
            dd = rrr["项目"].ToString();
            for (var i = 0; i < ary.Length; i++)
            for (int i = 0; i < ary.Length; i++)
            {
                var cell7 = row7.CreateCell(i);
                ICell cell7 = row7.CreateCell(i);
                cell7.CellStyle = style;
                if (i == 0)
                {
                    cell7.SetCellValue(_tmp);
                    if (!string.IsNullOrEmpty(_tmp) && int.Parse(_tmphb) > 1)
                    {
                        if (rrr["项目"].ToString() == "品水测试" ||
                            rrr["项目"].ToString() == "关键部件一致性")
                            sheet.AddMergedRegion(new CellRangeAddress(_idx - 1,
                                _idx + int.Parse(_tmphb) - 1, 0, 0));
                        if (rrr["项目"].ToString() == "品水测试" || rrr["项目"].ToString() == "关键部件一致性" )
                            sheet.AddMergedRegion(new CellRangeAddress(_idx-1, _idx + int.Parse(_tmphb)-1, 0, 0));
                        else
                            sheet.AddMergedRegion(new CellRangeAddress(_idx,
                                _idx + int.Parse(_tmphb) - 1, 0, 0));
                            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx + int.Parse(_tmphb) - 1, 0, 0));
                    }
                }
                else
@@ -522,8 +519,7 @@
                            cell7.SetCellValue(rrr["制热性能table"].ToString());
                            row7.HeightInPoints = rowHeight * 5;
                            if (i == ary.Length - 1)
                                sheet.AddMergedRegion(
                                    new CellRangeAddress(_idx, _idx, 1, 6));
                                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 6));
                            break;
                        case "品水测试":
                            //度数
@@ -537,12 +533,9 @@
                                cell7.SetCellValue(rrr["检验结果"].ToString());
                            if (i == ary.Length - 1)
                            {
                                sheet.AddMergedRegion(
                                    new CellRangeAddress(_idx, _idx, 1, 2));
                                sheet.AddMergedRegion(
                                    new CellRangeAddress(_idx, _idx, 3, 4));
                                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 2));
                                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 3, 4));
                            }
                            break;
                        case "关键部件一致性":
                            if (i == 1)
@@ -554,8 +547,7 @@
                            if (i == 4)
                                cell7.SetCellValue(rrr["认证信息"].ToString());
                            if (i == 5)
                                cell7.SetCellValue(rrr["是否符合CCC一致性"]
                                    .ToString());
                                cell7.SetCellValue(rrr["是否符合CCC一致性"].ToString());
                            //if (i == 6)
                            //    cell7.SetCellValue(rrr["检验结果"].ToString());
                            break;
@@ -565,30 +557,26 @@
                    }
                }
            }
            _idx++;
        }
        var row8 = sheet.CreateRow(_idx);
        IRow row8 = sheet.CreateRow(_idx);
        row8.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row8.CreateCell(colIndex);
            ICell cell = row8.CreateCell(colIndex);
            cell.CellStyle = style12;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5));
        setCellVal(sheet, _idx, 0, "综合判定");
        setCellVal(sheet, _idx, 1, "合格");
        _idx++;
        var row9 = sheet.CreateRow(_idx);
        IRow row9 = sheet.CreateRow(_idx);
        row9.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row9.CreateCell(colIndex);
            ICell cell = row9.CreateCell(colIndex);
            cell.CellStyle = style;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 3));
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 4, 6));
        setCellVal(sheet, _idx, 1, "工艺  已确认:合格");
@@ -596,27 +584,25 @@
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx, 0, 0));
        _idx++;
        var row10 = sheet.CreateRow(_idx);
        IRow row10 = sheet.CreateRow(_idx);
        row10.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row10.CreateCell(colIndex);
            ICell cell = row10.CreateCell(colIndex);
            cell.CellStyle = style12;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5));
        setCellVal(sheet, _idx, 0, "审核意见");
        setCellVal(sheet, _idx, 1, "合格");
        _idx++;
        var row11 = sheet.CreateRow(_idx);
        IRow row11 = sheet.CreateRow(_idx);
        row11.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row11.CreateCell(colIndex);
            ICell cell = row11.CreateCell(colIndex);
            cell.CellStyle = style12;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 6));
        setCellVal(sheet, _idx, 0, "首件填写,来料检验");
        //****合并好后开始赋值end**************
@@ -637,26 +623,26 @@
    }
    /// <summary>
    ///     生成iqc
    /// 生成iqc
    /// </summary>
    /// <param name="dtSource"></param>
    public static void ExportIqc(DataSet dtSource, string strFileName)
    {
        //行高
        var rowHeight = 25;
        int rowHeight = 25;
        //总列
        var maxCols = 8;
        int maxCols = 8;
        // 创建工作簿
        var workbook = new HSSFWorkbook();
        var sheet = workbook.CreateSheet("Sheet1");
        HSSFWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet("Sheet1");
        // 创建单元格样式 - 带边框和指定字体
        var style = getStyle(workbook);
        var styleHeader = getStyle(workbook, 20, true, true);
        var style12 = getStyle(workbook, 11, false, true);
        ICellStyle style = getStyle(workbook);
        ICellStyle styleHeader = getStyle(workbook, 20, true, true);
        ICellStyle style12 = getStyle(workbook, 11, false, true);
        // 设置列宽(6列)
        sheet.SetColumnWidth(0, 3000); // 第一列稍宽
        sheet.SetColumnWidth(0, 3000);  // 第一列稍宽
        sheet.SetColumnWidth(1, 3000);
        sheet.SetColumnWidth(2, 3000);
        sheet.SetColumnWidth(3, 3000);
@@ -665,15 +651,15 @@
        sheet.SetColumnWidth(6, 3000);
        sheet.SetColumnWidth(7, 3000);
        // 创建9行
        for (var rowIndex = 0; rowIndex <= 8; rowIndex++)
        for (int rowIndex = 0; rowIndex <= 8; rowIndex++)
        {
            var row = sheet.CreateRow(rowIndex);
            IRow row = sheet.CreateRow(rowIndex);
            // 设置行高(所有行相同高度)
            row.HeightInPoints = rowHeight;
            // 创建个单元格
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row.CreateCell(colIndex);
                ICell cell = row.CreateCell(colIndex);
                if (rowIndex == 1)
                    cell.CellStyle = styleHeader;
                else
@@ -682,10 +668,9 @@
                cell.SetCellValue($"行{rowIndex + 1}列{colIndex + 1}");
            }
        }
        //这是表头
        var tb0 = dtSource.Tables[0];
        var row0 = tb0.Rows[0];
        DataTable tb0 = dtSource.Tables[0];
        DataRow row0 = tb0.Rows[0];
        //第一行列合并
        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 3));
        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 4, 7));
@@ -745,19 +730,18 @@
        setCellVal(sheet, 8, 6, "检验记录");
        setCellVal(sheet, 8, 7, "检验结果");
        ////从第9行开始,就是循环数据库
        var _idx = 9;
        var tb1 = dtSource.Tables[1];
        int _idx = 9;
        DataTable tb1 = dtSource.Tables[1];
        foreach (DataRow rrr in tb1.Rows)
        {
            var row7 = sheet.CreateRow(_idx);
            IRow row7 = sheet.CreateRow(_idx);
            row7.HeightInPoints = rowHeight;
            for (var i = 0; i < maxCols; i++)
            for (int i = 0; i < maxCols; i++)
            {
                var cell7 = row7.CreateCell(i);
                ICell cell7 = row7.CreateCell(i);
                cell7.CellStyle = style;
                // cell7.SetCellValue(rrr[ary[i]].ToString());
            }
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5));
            setCellVal(sheet, _idx, 0, rrr["项目"].ToString());
            setCellVal(sheet, _idx, 1, rrr["质量要求"].ToString());
@@ -765,33 +749,29 @@
            setCellVal(sheet, _idx, 7, rrr["检验结果"].ToString());
            _idx++;
        }
        //备注
        var row8 = sheet.CreateRow(_idx);
        IRow row8 = sheet.CreateRow(_idx);
        row8.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row8.CreateCell(colIndex);
            ICell cell = row8.CreateCell(colIndex);
            cell.CellStyle = style12;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 7));
        setCellVal(sheet, _idx, 0, "备注:");
        _idx++;
        //综合判定
        for (var i = 0; i < 2; i++)
        for (int i = 0; i < 2; i++)
        {
            var row9 = sheet.CreateRow(_idx);
            IRow row9 = sheet.CreateRow(_idx);
            row9.HeightInPoints = rowHeight;
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row9.CreateCell(colIndex);
                ICell cell = row9.CreateCell(colIndex);
                cell.CellStyle = style;
            }
            _idx++;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 1, 0, 0));
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 2, 1, 7));
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx - 1, 1, 7));
@@ -799,19 +779,17 @@
        setCellVal(sheet, _idx - 2, 1, row0["zhpd"].ToString());
        setCellVal(sheet, _idx - 1, 1, row0["zhpdqz"].ToString());
        //审核意见:
        for (var i = 0; i < 2; i++)
        for (int i = 0; i < 2; i++)
        {
            var row9 = sheet.CreateRow(_idx);
            IRow row9 = sheet.CreateRow(_idx);
            row9.HeightInPoints = rowHeight;
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row9.CreateCell(colIndex);
                ICell cell = row9.CreateCell(colIndex);
                cell.CellStyle = style;
            }
            _idx++;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 1, 0, 0));
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 2, _idx - 2, 1, 7));
        sheet.AddMergedRegion(new CellRangeAddress(_idx - 1, _idx - 1, 1, 7));
@@ -819,31 +797,26 @@
        setCellVal(sheet, _idx - 2, 1, row0["shyj"].ToString());
        setCellVal(sheet, _idx - 1, 1, row0["shyjqz"].ToString());
        string[] ary = { "采购部意见", "销售部意见", "技术部意见", "生产部意见", "品质部意见" };
        for (var i = 0; i < ary.Length; i++)
        for (int i = 0; i < ary.Length; i++)
        {
            var row9 = sheet.CreateRow(_idx);
            IRow row9 = sheet.CreateRow(_idx);
            row9.HeightInPoints = rowHeight;
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row9.CreateCell(colIndex);
                ICell cell = row9.CreateCell(colIndex);
                cell.CellStyle = style;
            }
            // sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 1));
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 2, 7));
            _idx++;
        }
        setCellVal(sheet, _idx - ary.Length, 0, "不合格评审:");
        sheet.AddMergedRegion(new CellRangeAddress(_idx - ary.Length, _idx - 1,
            0, 0));
        for (var i = 0; i < ary.Length; i++)
        sheet.AddMergedRegion(new CellRangeAddress(_idx - ary.Length, _idx - 1, 0, 0));
        for (int i = 0; i < ary.Length; i++)
        {
            setCellVal(sheet, _idx - i - 1, 1, ary[i]);
            setCellVal(sheet, _idx - i - 1, 2,
                "□ 同意           □ 不同意        签名/日期:");
            setCellVal(sheet, _idx - i - 1, 2, "□ 同意           □ 不同意        签名/日期:");
        }
        //****合并好后开始赋值end**************
        //保存
        using (var ms = new MemoryStream())
@@ -863,26 +836,26 @@
    /// <summary>
    ///     生成巡检
    /// 生成巡检
    /// </summary>
    /// <param name="dtSource"></param>
    public static void ExportXunJian(DataSet dtSource, string strFileName)
    {
        var tb0 = dtSource.Tables[0];
        var row0 = tb0.Rows[0];
        var tb1 = dtSource.Tables[1];
        DataTable tb0 = dtSource.Tables[0];
        DataRow row0 = tb0.Rows[0];
        DataTable tb1 = dtSource.Tables[1];
        //行高
        var rowHeight = 25;
        int rowHeight = 25;
        //总列
        var maxCols = 10;
        var workbook = new HSSFWorkbook();
        var sheet = workbook.CreateSheet("Sheet1");
        int maxCols = 10;
        HSSFWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet("Sheet1");
        // 创建单元格样式 - 带边框和指定字体
        var style = getStyle(workbook);
        var styleHeader = getStyle(workbook, 20, true, true);
        var style12 = getStyle(workbook, 11, false, true);
        ICellStyle style = getStyle(workbook);
        ICellStyle styleHeader = getStyle(workbook, 20, true, true);
        ICellStyle style12 = getStyle(workbook, 11, false, true);
        // 设置列宽(10列)
        sheet.SetColumnWidth(0, 3000); // 第一列稍宽
        sheet.SetColumnWidth(0, 3000);  // 第一列稍宽
        sheet.SetColumnWidth(1, 3000);
        sheet.SetColumnWidth(2, 3000);
        sheet.SetColumnWidth(3, 3000);
@@ -893,22 +866,21 @@
        sheet.SetColumnWidth(8, 3000);
        sheet.SetColumnWidth(9, 3000);
        // 创建头行
        for (var rowIndex = 0; rowIndex <= 2; rowIndex++)
        for (int rowIndex = 0; rowIndex <= 2; rowIndex++)
        {
            var row = sheet.CreateRow(rowIndex);
            IRow row = sheet.CreateRow(rowIndex);
            // 设置行高(所有行相同高度)
            row.HeightInPoints = rowHeight;
            // 创建个单元格
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell = row.CreateCell(colIndex);
                ICell cell = row.CreateCell(colIndex);
                if (rowIndex == 0)
                    cell.CellStyle = styleHeader;
                else
                    cell.CellStyle = style;
            }
        }
        //第一行列合并
        sheet.AddMergedRegion(new CellRangeAddress(0, 0, 0, 9));
        setCellVal(sheet, 0, 0, row0["title"].ToString());
@@ -922,8 +894,8 @@
        setCellVal(sheet, 1, 5, "规格型号");
        setCellVal(sheet, 1, 6, row0["itemModel"].ToString());
        //第三行列合并
        sheet.AddMergedRegion(new CellRangeAddress(2, 2, 2, 4));
        setCellVal(sheet, 2, 0, "序号");
        sheet.AddMergedRegion(new CellRangeAddress(2, 2,2, 4));
        setCellVal(sheet,2, 0, "序号");
        setCellVal(sheet, 2, 1, "检验项目");
        setCellVal(sheet, 2, 2, "检验标准");
        setCellVal(sheet, 2, 5, row0["tm1"].ToString());
@@ -932,14 +904,14 @@
        setCellVal(sheet, 2, 8, row0["tm4"].ToString());
        setCellVal(sheet, 2, 9, row0["tm5"].ToString());
        //循环数据库
        var _idx = 3;
        int _idx = 3;
        foreach (DataRow rrr in tb1.Rows)
        {
            var row7 = sheet.CreateRow(_idx);
            IRow row7 = sheet.CreateRow(_idx);
            row7.HeightInPoints = rowHeight;
            for (var colIndex = 0; colIndex < maxCols; colIndex++)
            for (int colIndex = 0; colIndex < maxCols; colIndex++)
            {
                var cell7 = row7.CreateCell(colIndex);
                ICell cell7 = row7.CreateCell(colIndex);
                cell7.CellStyle = style;
                // cell7.SetCellValue("1");
                switch (colIndex)
@@ -948,8 +920,7 @@
                        cell7.SetCellValue(rrr["序号"].ToString());
                        break;
                    case 1:
                        sheet.AddMergedRegion(
                            new CellRangeAddress(_idx, _idx, 2, 4));
                        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 2, 4));
                        cell7.SetCellValue(rrr["检验项目"].ToString());
                        break;
                    case 2:
@@ -972,19 +943,16 @@
                        break;
                }
            }
            _idx++;
        }
        ////备注
        var row8 = sheet.CreateRow(_idx);
        IRow row8 = sheet.CreateRow(_idx);
        row8.HeightInPoints = rowHeight;
        for (var colIndex = 0; colIndex < maxCols; colIndex++)
        for (int colIndex = 0; colIndex < maxCols; colIndex++)
        {
            var cell = row8.CreateCell(colIndex);
            ICell cell = row8.CreateCell(colIndex);
            cell.CellStyle = style12;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 4));
        setCellVal(sheet, _idx, 0, "巡检人:");
        setCellVal(sheet, _idx, 5, row0["xjr1"].ToString());
@@ -1009,77 +977,74 @@
    }
    /// <summary>
    ///     生成成品检验报告(按实际模板结构)
    /// 生成成品检验报告(按实际模板结构)
    /// </summary>
    /// <param name="dtSource"></param>
    /// <param name="strFileName"></param>
    public static void ExportChengPin(DataSet dtSource, string strFileName)
    {
        //行高
        var rowHeight = 25;
        int rowHeight = 25;
        //总列数 - 根据模板分析,至少需要18列
        var maxCols = 18;
        int maxCols = 18;
        // 创建工作簿
        var workbook = new HSSFWorkbook();
        var sheet = workbook.CreateSheet("Sheet1");
        HSSFWorkbook workbook = new HSSFWorkbook();
        ISheet sheet = workbook.CreateSheet("Sheet1");
        // 创建单元格样式
        var style = getStyle(workbook);
        var styleHeader = getStyle(workbook, 16, true, true);
        var styleTitle = getStyle(workbook, 14, true, true);
        var styleSmall = getStyle(workbook, 10);
        ICellStyle style = getStyle(workbook);
        ICellStyle styleHeader = getStyle(workbook, 16, true, true);
        ICellStyle styleTitle = getStyle(workbook, 14, true, true);
        ICellStyle styleSmall = getStyle(workbook, 10, false, false);
        // 设置列宽
        sheet.SetColumnWidth(0, 3500); // A列:项目名称
        sheet.SetColumnWidth(1, 5000); // B列:标准/规范
        for (var i = 2; i < 18; i++) // C到R列:16个检测值列
            sheet.SetColumnWidth(i, 2500);
        //获取表头数据
        var tb0 = dtSource.Tables[0];
        var row0 = tb0.Rows[0];
        var _idx = 0;
        // 第1行:报告标题
        var titleRow = sheet.CreateRow(_idx);
        titleRow.HeightInPoints = 30;
        for (var i = 0; i < maxCols; i++)
        sheet.SetColumnWidth(0, 3500);   // A列:项目名称
        sheet.SetColumnWidth(1, 5000);   // B列:标准/规范
        for (int i = 2; i < 18; i++)     // C到R列:16个检测值列
        {
            var cell = titleRow.CreateCell(i);
            cell.CellStyle = styleHeader;
            sheet.SetColumnWidth(i, 2500);
        }
        //获取表头数据
        DataTable tb0 = dtSource.Tables[0];
        DataRow row0 = tb0.Rows[0];
        int _idx = 0;
        // 第1行:报告标题
        IRow titleRow = sheet.CreateRow(_idx);
        titleRow.HeightInPoints = 30;
        for (int i = 0; i < maxCols; i++)
        {
            ICell cell = titleRow.CreateCell(i);
            cell.CellStyle = styleHeader;
        }
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, maxCols - 1));
        setCellVal(sheet, _idx, 0, "成品检验报告");
        _idx++;
        // 第2行:基本信息第一行
        var info1Row = sheet.CreateRow(_idx);
        IRow info1Row = sheet.CreateRow(_idx);
        info1Row.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = info1Row.CreateCell(i);
            ICell cell = info1Row.CreateCell(i);
            cell.CellStyle = style;
        }
        setCellVal(sheet, _idx, 0,
            "生产车间:" + (row0["workShop"]?.ToString() ?? ""));
        setCellVal(sheet, _idx, 0, "生产车间:" + (row0["workShop"]?.ToString() ?? ""));
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 5));
        setCellVal(sheet, _idx, 12,
            "室温:" + (row0["temperature"]?.ToString() ?? ""));
        setCellVal(sheet, _idx, 12, "室温:" + (row0["temperature"]?.ToString() ?? ""));
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 12, 17));
        _idx++;
        // 第3行:产品信息
        var info2Row = sheet.CreateRow(_idx);
        IRow info2Row = sheet.CreateRow(_idx);
        info2Row.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = info2Row.CreateCell(i);
            ICell cell = info2Row.CreateCell(i);
            cell.CellStyle = style;
        }
        setCellVal(sheet, _idx, 0, "产品名称");
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 4));
        setCellVal(sheet, _idx, 1, row0["itemName"]?.ToString() ?? "");
@@ -1096,14 +1061,13 @@
        _idx++;
        // 第4行:商标等信息
        var info3Row = sheet.CreateRow(_idx);
        IRow info3Row = sheet.CreateRow(_idx);
        info3Row.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = info3Row.CreateCell(i);
            ICell cell = info3Row.CreateCell(i);
            cell.CellStyle = style;
        }
        setCellVal(sheet, _idx, 0, "商标");
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 4));
        setCellVal(sheet, _idx, 1, row0["brand"]?.ToString() ?? "");
@@ -1120,14 +1084,13 @@
        _idx++;
        // 第5行:AC/Re标准
        var acreRow = sheet.CreateRow(_idx);
        IRow acreRow = sheet.CreateRow(_idx);
        acreRow.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = acreRow.CreateCell(i);
            ICell cell = acreRow.CreateCell(i);
            cell.CellStyle = style;
        }
        setCellVal(sheet, _idx, 0, "Ac/Re(A类)");
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 5));
        setCellVal(sheet, _idx, 1, row0["acRe_A"]?.ToString() ?? "");
@@ -1142,21 +1105,18 @@
        _idx++;
        // 第6行:抽样信息
        var sampleRow = sheet.CreateRow(_idx);
        IRow sampleRow = sheet.CreateRow(_idx);
        sampleRow.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = sampleRow.CreateCell(i);
            ICell cell = sampleRow.CreateCell(i);
            cell.CellStyle = style;
        }
        setCellVal(sheet, _idx, 0, "抽样");
        setCellVal(sheet, _idx, 1, "匀速");
        setCellVal(sheet, _idx, 2,
            row0["SampleMethod"]?.ToString() == "匀速" ? "√" : "");
        setCellVal(sheet, _idx, 2, row0["SampleMethod"]?.ToString() == "匀速" ? "√" : "");
        setCellVal(sheet, _idx, 3, "随机");
        setCellVal(sheet, _idx, 4,
            row0["SampleMethod"]?.ToString() == "随机" ? "√" : "");
        setCellVal(sheet, _idx, 4, row0["SampleMethod"]?.ToString() == "随机" ? "√" : "");
        setCellVal(sheet, _idx, 5, "样本数");
        setCellVal(sheet, _idx, 6, "匀速抽样数");
@@ -1168,35 +1128,36 @@
        _idx++;
        // 第7行:检验项目表头
        var headerRow = sheet.CreateRow(_idx);
        IRow headerRow = sheet.CreateRow(_idx);
        headerRow.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = headerRow.CreateCell(i);
            ICell cell = headerRow.CreateCell(i);
            cell.CellStyle = styleTitle;
        }
        setCellVal(sheet, _idx, 0, "项目");
        setCellVal(sheet, _idx, 1, "标准");
        setCellVal(sheet, _idx, 2, "1");
        setCellVal(sheet, _idx, 3, "2");
        // 根据需要继续添加更多列标题,这里简化为主要列
        for (var i = 4; i < 18; i++)
            setCellVal(sheet, _idx, i, (i - 1).ToString());
        for (int i = 4; i < 18; i++)
        {
            setCellVal(sheet, _idx, i, (i-1).ToString());
        }
        _idx++;
        // 检验项目数据
        if (dtSource.Tables.Count > 1)
        {
            var tb1 = dtSource.Tables[1];
            DataTable tb1 = dtSource.Tables[1];
            foreach (DataRow rrr in tb1.Rows)
            {
                var dataRow = sheet.CreateRow(_idx);
                IRow dataRow = sheet.CreateRow(_idx);
                dataRow.HeightInPoints = rowHeight;
                for (var i = 0; i < maxCols; i++)
                for (int i = 0; i < maxCols; i++)
                {
                    var cell = dataRow.CreateCell(i);
                    ICell cell = dataRow.CreateCell(i);
                    cell.CellStyle = style;
                }
@@ -1204,15 +1165,17 @@
                setCellVal(sheet, _idx, 1, rrr["RPB004"]?.ToString() ?? "");
                // 填充16个测试值
                for (var i = 0; i < 16; i++)
                for (int i = 0; i < 16; i++)
                {
                    var colName =
                        $"RPB{i + 5:D3}"; // RPB005, RPB006, ..., RPB020
                    string colName = $"RPB{i + 5:D3}"; // RPB005, RPB006, ..., RPB020
                    if (rrr.Table.Columns.Contains(colName))
                        setCellVal(sheet, _idx, i + 2,
                            rrr[colName]?.ToString() ?? "");
                    {
                        setCellVal(sheet, _idx, i + 2, rrr[colName]?.ToString() ?? "");
                    }
                    else
                    {
                        setCellVal(sheet, _idx, i + 2, "");
                    }
                }
                _idx++;
@@ -1220,66 +1183,59 @@
        }
        // 不合格内容记录
        var defectHeaderRow = sheet.CreateRow(_idx);
        IRow defectHeaderRow = sheet.CreateRow(_idx);
        defectHeaderRow.HeightInPoints = rowHeight;
        for (var i = 0; i < maxCols; i++)
        for (int i = 0; i < maxCols; i++)
        {
            var cell = defectHeaderRow.CreateCell(i);
            ICell cell = defectHeaderRow.CreateCell(i);
            cell.CellStyle = styleTitle;
        }
        setCellVal(sheet, _idx, 0, "序号");
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1,
            10)); // 不合格内容占多列
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 10)); // 不合格内容占多列
        setCellVal(sheet, _idx, 1, "不合格内容");
        setCellVal(sheet, _idx, 11, "A类");
        setCellVal(sheet, _idx, 12, "B类");
        setCellVal(sheet, _idx, 13, "C类");
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 14,
            17)); // 注意点占剩余列
        sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 14, 17)); // 注意点占剩余列
        setCellVal(sheet, _idx, 14, "注意点");
        _idx++;
        if (dtSource.Tables.Count > 2)
        {
            var tb2 = dtSource.Tables[2];
            DataTable tb2 = dtSource.Tables[2];
            foreach (DataRow rrr in tb2.Rows)
            {
                if (rrr["Description"]?.ToString() == "不良数量")
                    break;
                var dataRow = sheet.CreateRow(_idx);
                IRow dataRow = sheet.CreateRow(_idx);
                dataRow.HeightInPoints = rowHeight;
                for (var i = 0; i < maxCols; i++)
                for (int i = 0; i < maxCols; i++)
                {
                    var cell = dataRow.CreateCell(i);
                    ICell cell = dataRow.CreateCell(i);
                    cell.CellStyle = style;
                }
                setCellVal(sheet, _idx, 0, rrr["Seq"]?.ToString() ?? "");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx, 1, 10)); // 不合格内容占多列
                setCellVal(sheet, _idx, 1,
                    rrr["Description"]?.ToString() ?? "");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 10)); // 不合格内容占多列
                setCellVal(sheet, _idx, 1, rrr["Description"]?.ToString() ?? "");
                setCellVal(sheet, _idx, 11, rrr["AClass"]?.ToString() ?? "");
                setCellVal(sheet, _idx, 12, rrr["BClass"]?.ToString() ?? "");
                setCellVal(sheet, _idx, 13, rrr["CClass"]?.ToString() ?? "");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx, 14, 17)); // 注意点占剩余列
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 14, 17)); // 注意点占剩余列
                setCellVal(sheet, _idx, 14, rrr["Point"]?.ToString() ?? "");
                _idx++;
            }
            var dr = tb2.Rows[tb2.Rows.Count - 1];
            DataRow dr = tb2.Rows[tb2.Rows.Count - 1];
            // 备注行
            var remarkRow = sheet.CreateRow(_idx);
            IRow remarkRow = sheet.CreateRow(_idx);
            remarkRow.HeightInPoints = rowHeight;
            for (var i = 0; i < maxCols; i++)
            for (int i = 0; i < maxCols; i++)
            {
                var cell = remarkRow.CreateCell(i);
                ICell cell = remarkRow.CreateCell(i);
                cell.CellStyle = style;
            }
            setCellVal(sheet, _idx, 0, "备注:");
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 8));
            setCellVal(sheet, _idx, 9, "不良数量:");
@@ -1287,33 +1243,31 @@
            setCellVal(sheet, _idx, 11, dr["AClass"]?.ToString() ?? "");
            setCellVal(sheet, _idx, 12, dr["BClass"]?.ToString() ?? "");
            setCellVal(sheet, _idx, 13, dr["CClass"]?.ToString() ?? "");
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 14,
                17)); // 注意点占剩余列
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 14, 17)); // 注意点占剩余列
            setCellVal(sheet, _idx, 14, dr["Point"]?.ToString() ?? "");
            _idx++;
            // 大的备注内容区域
            var remarkContentRow = sheet.CreateRow(_idx);
            IRow remarkContentRow = sheet.CreateRow(_idx);
            remarkContentRow.HeightInPoints = 60;
            for (var i = 0; i < maxCols; i++)
            for (int i = 0; i < maxCols; i++)
            {
                var cell = remarkContentRow.CreateCell(i);
                ICell cell = remarkContentRow.CreateCell(i);
                cell.CellStyle = style;
            }
            sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 0, 17));
            setCellVal(sheet, _idx, 0, dr["Remark"]?.ToString() ?? "");
            _idx++;
        }
        // 检验判定区域(3行布局)
        for (var judgeRowIndex = 0; judgeRowIndex < 3; judgeRowIndex++)
        for (int judgeRowIndex = 0; judgeRowIndex < 3; judgeRowIndex++)
        {
            var judgmentRow = sheet.CreateRow(_idx);
            IRow judgmentRow = sheet.CreateRow(_idx);
            judgmentRow.HeightInPoints = rowHeight;
            for (var i = 0; i < maxCols; i++)
            for (int i = 0; i < maxCols; i++)
            {
                var cell = judgmentRow.CreateCell(i);
                ICell cell = judgmentRow.CreateCell(i);
                cell.CellStyle = styleTitle;
            }
@@ -1321,90 +1275,110 @@
            {
                // 第一行:检验判定
                setCellVal(sheet, _idx, 0, "检验判定");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx + 2, 0, 0)); // 检验判定跨3行
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx + 2, 0, 0)); // 检验判定跨3行
                if (row0["CheckResult"]?.ToString() == "合格")
                {
                    setCellVal(sheet, _idx, 1, "√ 合格    □ 不合格");
                else if (row0["CheckResult"]?.ToString() == "不合格")
                }
                else if(row0["CheckResult"]?.ToString() == "不合格")
                {
                    setCellVal(sheet, _idx, 1, "□ 合格    √ 不合格");
                }
                else
                {
                    setCellVal(sheet, _idx, 1, "□ 合格    □ 不合格");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx + 1, 1, 5)); // 合格/不合格跨2行
                }
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx + 1, 1, 5)); // 合格/不合格跨2行
                setCellVal(sheet, _idx, 6, "审核");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx + 2, 6, 6)); // 审核跨3行
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx + 2, 6, 6)); // 审核跨3行
                if (row0["ProcessResults"]?.ToString() == "无")
                {
                    setCellVal(sheet, _idx, 7, "√ 无    □ 返工");
                }
                else if (row0["ProcessResults"]?.ToString() == "返工")
                {
                    setCellVal(sheet, _idx, 7, "□ 无    √ 返工");
                }
                else
                {
                    setCellVal(sheet, _idx, 7, "□ 无    □ 返工");
                }
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 7, 11));
                setCellVal(sheet, _idx, 12, "审批");
                sheet.AddMergedRegion(
                    new CellRangeAddress(_idx, _idx + 2, 12, 12)); // 审批跨3行
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx + 2, 12, 12)); // 审批跨3行
                if (row0["ProcessResults"]?.ToString() == "无")
                {
                    setCellVal(sheet, _idx, 13, "√ 无    □ 返工");
                }
                else if (row0["ProcessResults"]?.ToString() == "返工")
                {
                    setCellVal(sheet, _idx, 13, "□ 无    √ 返工");
                }
                else
                {
                    setCellVal(sheet, _idx, 13, "□ 无    □ 返工");
                }
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 13, 17));
            }
            else if (judgeRowIndex == 1)
            {
                if (row0["ProcessResults"]?.ToString() == "让步接收")
                {
                    setCellVal(sheet, _idx, 7, "√ 让步接收    □ 特采");
                }
                else if (row0["ProcessResults"]?.ToString() == "特采")
                {
                    setCellVal(sheet, _idx, 7, "□ 让步接收    √ 特采");
                }
                else
                {
                    setCellVal(sheet, _idx, 7, "□ 让步接收    □ 特采");
                }
                // 第二行:让步接收选项
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 7, 11));
                if (row0["ProcessResults"]?.ToString() == "让步接收")
                {
                    setCellVal(sheet, _idx, 13, "√ 让步接收    □ 特采");
                }
                else if (row0["ProcessResults"]?.ToString() == "特采")
                {
                    setCellVal(sheet, _idx, 13, "□ 让步接收    √ 特采");
                }
                else
                {
                    setCellVal(sheet, _idx, 13, "□ 让步接收    □ 特采");
                }
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 13, 17));
            }
            else
            {
                // 签名行
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 1, 2));
                setCellVal(sheet, _idx, 1, "签名/日期:");
                setCellVal(sheet, _idx, 1, $"签名/日期:");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 3, 5));
                setCellVal(sheet, _idx, 3,
                    $"{row0["JY_USER"]?.ToString() ?? ""}/{row0["JY_DATE"]?.ToString() ?? ""}");
                setCellVal(sheet, _idx, 3, $"{row0["JY_USER"]?.ToString() ?? ""}/{row0["JY_DATE"]?.ToString() ?? ""}");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 7, 8));
                setCellVal(sheet, _idx, 7, "签名/日期:");
                setCellVal(sheet, _idx, 7, $"签名/日期:");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 9, 11));
                setCellVal(sheet, _idx, 9,
                    $"{row0["CHECK_USER"]?.ToString() ?? ""}/{row0["CHECK_DATE"]?.ToString() ?? ""}");
                setCellVal(sheet, _idx, 9, $"{row0["CHECK_USER"]?.ToString() ?? ""}/{row0["CHECK_DATE"]?.ToString() ?? ""}");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 13, 14));
                setCellVal(sheet, _idx, 13, "签名/日期:");
                setCellVal(sheet, _idx, 13, $"签名/日期:");
                sheet.AddMergedRegion(new CellRangeAddress(_idx, _idx, 15, 17));
                setCellVal(sheet, _idx, 15,
                    $"{row0["SP_USER"]?.ToString() ?? ""}/{row0["SP_DATE"]?.ToString() ?? ""}");
                setCellVal(sheet, _idx, 15, $"{row0["SP_USER"]?.ToString() ?? ""}/{row0["SP_DATE"]?.ToString() ?? ""}");
            }
            _idx++;
        }
        //保存
        using (var ms = new MemoryStream())
        {
            using (var fs = new FileStream(strFileName, FileMode.Create,
                       FileAccess.Write))
            using (var fs = new FileStream(strFileName, FileMode.Create, FileAccess.Write))
            {
                workbook.Write(ms);
                ms.Flush();
@@ -1504,4 +1478,4 @@
                return "=" + cell.CellFormula;
        }
    }
}
}