package digital.laboratory.platform.inspection.utils.sewagereport;

import cn.hutool.core.collection.CollUtil;
import com.deepoove.poi.util.TableTools;
import digital.laboratory.platform.inspection.dto.RegionalDrugConsumptionDTO;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import java.math.BigInteger;
import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;

/**
* date: 2024/4/26 14:04
* @author: Chen
* @since JDK 1.8
* Description: 污水样本分析报告各类表格生成工具类, 设置word纸张方向api
*/
public class TableCreateUtils {

    public static final String SUBSECTIONONE = "v";

    public static final String SUBSECTIONTWO = "landscape"; // 纸张方向为横向

    /**
     * 分段
     * @param xwpfDocument 要生成的word文档对象
     * @param result SUBSECTIONONE / SUBSECTIONTWO
     */
    public static void subsection(XWPFDocument xwpfDocument, String result) {
        CTDocument1 doc = xwpfDocument.getDocument();
        CTBody body = doc.getBody();
        CTP ctp = body.addNewP();
        CTPPr ctpPr = ctp.addNewPPr();
        CTSectPr ctSectPr = ctpPr.addNewSectPr();
        changeOrientation(ctSectPr, result);
    }

    /**
     * 陕西省各行政区主要毒品总消费量表
     * @param document 生成表格的文档对象
     * @param rows 表格的行数
     * @param cols 表格的列数
     * @param nameList 表格的表头名称
     * @param dataList 表格数据列表
     */
    public static void fetchRegionalDrugConsumptionTable(XWPFDocument document, int rows, int cols, List<String> nameList, List<RegionalDrugConsumptionDTO> dataList) {

        // 创建一个rows行cols列的表格
        XWPFTable table = getXwpfTable(document, rows, cols);

        // 给表格设置边框
        setTableBorderAttributes(table);

        // 遍历表格设置属性
        List<XWPFTableRow> tableRowList = table.getRows();
        setTableCellAttribute(tableRowList);
        // 合并单元格
        int mergeCount = tableRowList.get(0).getTableCells().size() / 2;
        TableTools.mergeCellsHorizonal(table, 0, 1, mergeCount);
        TableTools.mergeCellsHorizonal(table, 0, 2, mergeCount + 1);

        //垂直合并第一列
        TableTools.mergeCellsVertically(table, 0, 0, 1);
        // 填充表格数据
        for (XWPFTableRow tableRow : table.getRows()) {
            switch (table.getRows().indexOf(tableRow)) {
                case 0:
                    tableRow.getCell(0).setText("行政区");
                    tableRow.getCell(1).setText("千人均消费量（毫克/千人/天）");
                    tableRow.getCell(2).setText("总消费量（克/天）");
                    break;
                case 1:
                    int size = tableRow.getTableCells().size();
                    for (int i = 1; i < size; i++) {
                        // 因为第一列的单元格被合并了，所以从第二个开始
                        tableRow.getCell(i).setText(nameList.get((i - 1) % nameList.size()));
                    }
                    break;
            }
        }
        // 填充数据
        for (int i = 0; i < dataList.size(); i++) {
            RegionalDrugConsumptionDTO dto = dataList.get(i);
            XWPFTableRow tableRow = table.getRow(i + 2);
            tableRow.getCell(0).setText(dto.getRegional());
            // 千人均消费量（毫克/千人/天）
            tableRow.getCell(1).setText(dto.getPccHeroin());
            tableRow.getCell(2).setText(dto.getPccMa());
            tableRow.getCell(3).setText(dto.getPccK());
            tableRow.getCell(4).setText(dto.getPccMdma());
            tableRow.getCell(5).setText(dto.getPccCoc());
            tableRow.getCell(6).setText(dto.getPccFen());
            tableRow.getCell(7).setText(dto.getPccTotal());

            // 总消费量（克/天）
            tableRow.getCell(8).setText(dto.getTcHeroin());
            tableRow.getCell(9).setText(dto.getTcMa());
            tableRow.getCell(10).setText(dto.getTcK());
            tableRow.getCell(11).setText(dto.getTcMdma());
            tableRow.getCell(12).setText(dto.getTcCoc());
            tableRow.getCell(13).setText(dto.getTcFen());
            tableRow.getCell(14).setText(dto.getTcTotal());

        }
    }

    /**
     * 陕西省各污水厂服务区及各行政区毒品千人均消费量表
     * @param document 生成表格的文档对象
     * @param rows 表格的行数
     * @param cols 表格的列数
     * @param nameList 表格的表头名称
     * @param dataMap 表格数据列表 第一个元素是 行政区 2 区县
     */
    public static void fetchServiceAreaDrugConsumptionPerThousandTable(XWPFDocument document, int rows, int cols, List<String> nameList, Map<String, List<List<Object>>> dataMap) {

        // 创建一个一行两列
        XWPFTable table = document.createTable(rows, cols);
//            table.setWidth("100%");
        // 创建表格后，添加grid 网格，grid 规定了表格每一列的宽度，对后面合并单元格有作用
        CTTblGrid grid = table.getCTTbl().addNewTblGrid();
        // grid 的宽度单位是 twips， twip 是 point 的 1/20。一英寸有 1440 twips, 一英寸 2.54厘米，
        // 假设我们的表格第一列 4cm，第二列 8cm，那么需要先除以 2.54 得到英寸再乘以 1440 得到 twips。
        for (int i = 0; i < cols; i++) {
            if (i == 1) {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (3 / 2.54 * 1440)));
            } else {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (1.5 / 2.54 * 1440)));
            }
        }

        // 给表格设置边框
        setTableBorderAttributes(table);
        List<XWPFTableRow> tableRows = table.getRows(); // 或row元素
        for (XWPFTableRow tableRow : tableRows) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRows.indexOf(tableRow);
                int indexOfCell = tableRow.getTableCells().indexOf(tableCell);
                if (indexOf == 1 || indexOf == 0) {
                    tableCell.getCTTc().addNewTcPr().addNewTcBorders();
                    tableCell.setColor("b5d9fc"); // 填充单元格颜色 91,155,213 5b9bd5 b5d9fc
                }
                if (indexOfCell == 1) {
                    tableCell.setWidth(Long.toString((long) (3 / 2.54 * 1440)));
                } else {
                    tableCell.setWidth(Long.toString((long) (1.5 / 2.54 * 1440)));
                }
                tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
            }
        }

        // 先垂直合并第9列 0，1单元格， 因为先操作水平合并后，表格结构发生改变不好操作
        TableTools.mergeCellsVertically(table, cols -1, 0, 1);
        // 水平合并 第一行 2到8列
        TableTools.mergeCellsHorizonal(table, 0, 2, 8);
        //垂直合并第一列
        TableTools.mergeCellsVertically(table, 0, 0, 1);
        // 垂直合并第二列 0，1单元格
        TableTools.mergeCellsVertically(table, 1, 0, 1);
        // 垂直合并剩下的第一列 1 到最后一行
        TableTools.mergeCellsVertically(table, 0, 2, tableRows.size() - 1);

        for (XWPFTableRow tableRow : tableRows) {
            switch (tableRows.indexOf(tableRow)) {
                case 0:
                    tableRow.getCell(0).setText("行政区");
                    tableRow.getCell(1).setText("区/县");
                    tableRow.getCell(2).setText("千人均消费量（毫克/千人/天）");
                    tableRow.getCell(3).setText("备注");
                    break;
                case 1:
                    int size = tableRow.getTableCells().size();
                    for (int i = 2; i < size -1; i++) {
                        // 因为第一列的单元格被合并了，所以从第二个开始
                        tableRow.getCell(i).setText(nameList.get((i -2) % nameList.size()));
                    }
                    break;
            }
        }
        // 填充表格数据
        dataMap.forEach((k,v) -> {
            // 前两行是表头，所以从第三行开始
            tableRows.get(2).getCell(0).setText(k);
            for (int i = 0; i < v.size(); i++) {
                List<Object> rowDataList = v.get(i);
                XWPFTableRow xwpfTableRow = tableRows.get(i + 2);
                for (int j = 0; j < rowDataList.size(); j++) {
                    xwpfTableRow.getCell(j + 1).setText(rowDataList.get(j).toString());
                }
            }
        });

    }

    /**
     * 陕西省各市毒品千人均消费量具体增长率/下降率表
     * @param document
     * @param rows
     * @param cols
     * @param cityNameList
     * @param dataList
     */
    public static void fetchCityDrugConsumptionGrowthRatesTable(XWPFDocument document, int rows, int cols, List<String> cityNameList, List<List<Object>> dataList) {

        // 创建一个一行两列
        XWPFTable table = getXwpfTable(document, rows, cols);

        // 给表格设置边框
        setTableBorderAttributes(table);
        List<XWPFTableRow> tableRows = table.getRows(); // 或row元素
        for (XWPFTableRow tableRow : tableRows) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRows.indexOf(tableRow);
                if (indexOf == 0) {
                    tableCell.setColor("bdd7ee"); // 填充单元格颜色
                }
                if (indexOf == 0 && tableRow.getTableCells().indexOf(tableCell) == 0) {
                    tableCell.setText("行政区");
                    for (XWPFParagraph row1Cell1Paragraph : tableCell.getParagraphs()) {
                        row1Cell1Paragraph.setAlignment(ParagraphAlignment.CENTER);
                        row1Cell1Paragraph.setVerticalAlignment(TextAlignment.TOP);
                    }
                    XWPFParagraph xwpfParagraph = tableCell.addParagraph();
                    xwpfParagraph.createRun().addBreak();
                    xwpfParagraph.createRun().addBreak();
                    xwpfParagraph.createRun().setText("增长/下降");
                    xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);
                    xwpfParagraph.setVerticalAlignment(TextAlignment.BOTTOM);

                    // 设置对角线
                    CTTcPr tcPr = tableCell.getCTTc().getTcPr();
                    CTTcBorders ctTcBorders = tcPr.isSetTcBorders() ? tcPr.getTcBorders() : tcPr.addNewTcBorders();
                    CTBorder ctBorder = ctTcBorders.isSetTl2Br() ? ctTcBorders.getTl2Br() : ctTcBorders.addNewTl2Br();
                    ctBorder.setVal(STBorder.SINGLE);
                    ctBorder.setSz(BigInteger.valueOf(4));
                    ctBorder.setSpace(BigInteger.valueOf(0));
                    ctBorder.setColor("auto");
                    tableCell.setWidth(Long.toString((long) (5 / 2.54 * 1440)));
                } else {
                    tableCell.setWidth(Long.toString((long) (2 / 2.54 * 1440)));
                    tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                    tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
                }
            }
        }
        for (XWPFTableRow row : tableRows) {
            int indexOfRow = tableRows.indexOf(row);
            switch (indexOfRow) {
                case 0:
                    for (int i = 1; i < row.getTableCells().size(); i++) {
                        XWPFTableCell cell = row.getCell(i);
                        cell.setText(cityNameList.get(i - 1));
                    }
                    break;
                default:
                    // 填充表格数据
                    XWPFTableRow xwpfTableRow = tableRows.get(indexOfRow);
                    List<Object> list = dataList.get(indexOfRow - 1);
                    for (int i = 0; i < xwpfTableRow.getTableCells().size(); i++) {
                        xwpfTableRow.getCell(i).setText(list.get(i).toString());
                    }
                    break;
            }
        }

    }


    /**
     * xxxx年mm月陕西省毒品滥用情况分析中各类毒品表生成
     * 表4 陕西省污水处理厂冰毒浓度排名表
     * 表5 陕西省污水处理厂吗啡检测情况
     * @param document
     * @param rows
     * @param cols
     * @param tableName1List
     * @param tableName2List
     * @param dataList
     */
    public static void fetchCityDrugAbuseConditionAnalysisTable(XWPFDocument document, int rows, int cols,
                                                                List<String> tableName1List, List<String> tableName2List, List<List<Object>> dataList) {
        // 创建一个一行两列
        XWPFTable table = document.createTable(rows, cols);
//            table.setWidth("100%");
        // 创建表格后，添加grid 网格，grid 规定了表格每一列的宽度，对后面合并单元格有作用
        CTTblGrid grid = table.getCTTbl().addNewTblGrid();
        // grid 的宽度单位是 twips， twip 是 point 的 1/20。一英寸有 1440 twips, 一英寸 2.54厘米，
        // 假设我们的表格第一列 4cm，第二列 8cm，那么需要先除以 2.54 得到英寸再乘以 1440 得到 twips。
        for (int i = 0; i < cols; i++) {
            if (i % 2 == 1) {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (4 / 2.54 * 1440)));
            } else {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (2 / 2.54 * 1440)));
            }
        }
        // 给表格设置边框
        setTableBorderAttributes(table);

        List<XWPFTableRow> tableRows = table.getRows();

        for (XWPFTableRow tableRow : tableRows) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRows.indexOf(tableRow);
                int indexOfCell = tableRow.getTableCells().indexOf(tableCell);
                if (indexOf == 1 || indexOf == 0) {
                    tableCell.setColor("bdd7ee"); // 填充单元格颜色
                }
                 if (indexOfCell % 2 == 1) {
                     tableCell.setWidth(Long.toString((long) (4 / 2.54 * 1440)));
                 } else {
                     tableCell.setWidth(Long.toString((long) (2 / 2.54 * 1440)));
                 }
                tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
            }
        }

//        for (String colName : tableName1List) {
// 潜在的逻辑错误：如果tableName1List中有重复的元素，那么indexOf将总是返回第一次出现的索引，这可能导致某些合并操作被错误地重复执行，而不是针对每个唯一的索引执行一次。
//            int indexOf = tableName1List.indexOf(colName);
//            switch (indexOf) {
//                case 0: {
//                    TableTools.mergeCellsHorizonal(table, 0, 1, 2);
//                    break;
//                }
//                case 1: {
//                    TableTools.mergeCellsHorizonal(table, 0, 2, 3);
//                    break;
//                }
//                case 2: {
//                    TableTools.mergeCellsHorizonal(table, 0, 3, 4);
//                    break;
//                }
//                case 3: {
//                    TableTools.mergeCellsHorizonal(table, 0, 4, 5);
//                    break;
//                }
//                case 4: {
//                    TableTools.mergeCellsHorizonal(table, 0, 5, 6);
//                    break;
//                }
//            }
//        }
        // 根据tableName1List的大小合并表头单元格
        for (int i = 0; i < tableName1List.size(); i++) {
            TableTools.mergeCellsHorizonal(table, 0, i + 1, i + 2);
        }
//        TableTools.mergeCellsHorizonal(table, 0, 1, 2);
//        TableTools.mergeCellsHorizonal(table, 0, 2, 3);
//        TableTools.mergeCellsHorizonal(table, 0, 3, 4);
//        TableTools.mergeCellsHorizonal(table, 0, 4, 5);
//        TableTools.mergeCellsHorizonal(table, 0, 5, 6);

        //垂直合并第一列
        TableTools.mergeCellsVertically(table, 0, 0, 1);

        for (XWPFTableRow tableRow : tableRows) {
            int indexOfRow = tableRows.indexOf(tableRow);
            switch (indexOfRow) {
                case 0:
                    tableRow.getCell(0).setText("序号");
                    List<XWPFTableCell> tableCells = tableRow.getTableCells();
                    for (int i = 1; i < tableCells.size() && i <= tableName1List.size(); i++) {
                        tableRow.getCell(i).setText(tableName1List.get(i -1));
                    }
                    break;
                case 1:
                    int size = tableRow.getTableCells().size();
                    for (int i = 1; i < size; i++) {
                        // 因为第一列的单元格被合并了，所以从第二个开始
                        tableRow.getCell(i).setText(tableName2List.get((i -1) % tableName2List.size()));
                    }
                    break;
                default:
                    // 数据填充
                    if (CollUtil.isNotEmpty(dataList)) {
                        XWPFTableRow xwpfTableRow = tableRows.get(indexOfRow);
                        List<Object> list = dataList.get(indexOfRow - 2);
                        for (int i = 0; i < xwpfTableRow.getTableCells().size() && i < list.size(); i++) {
                            xwpfTableRow.getCell(i).setText(list.get(i).toString());
                        }
                    }
                    break;
            }
        }
    }

    /**
     * 附表：陕西省各污水厂监测点主要毒品及其代谢物每日浓度表
     * @param document
     * @param rows
     * @param cols
     * @param tableName2List
     * @param dataMap
     */
    public static void fetchDailyDrugAndMetaboliteConcentrationTable(XWPFDocument document, int rows, int cols,
                                                                List<String> tableName2List, Map<String, List<List<Object>>> dataMap) {

        XWPFTable table = document.createTable(rows, cols);
//            table.setWidth("100%");
        // 创建表格后，添加grid 网格，grid 规定了表格每一列的宽度，对后面合并单元格有作用
        CTTblGrid grid = table.getCTTbl().addNewTblGrid();
        // grid 的宽度单位是 twips， twip 是 point 的 1/20。一英寸有 1440 twips, 一英寸 2.54厘米，
        // 假设我们的表格第一列 4cm，第二列 8cm，那么需要先除以 2.54 得到英寸再乘以 1440 得到 twips。
        for (int i = 0; i < table.getRows().get(0).getTableCells().size(); i++) {
            if (i == 1) {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (4 / 2.54 * 1440)));
            } else {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (2 / 2.54 * 1440)));
            }
        }
        // 设置表格边框属性
        setTableBorderAttributes(table);

        List<XWPFTableRow> tableRows = table.getRows();
        for (XWPFTableRow tableRow : tableRows) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRows.indexOf(tableRow);
                int indexOfCell = tableRow.getTableCells().indexOf(tableCell);
                if (indexOf == 1 || indexOf == 0) {
                    tableCell.setColor("5b9bd5"); // 填充单元格颜色
                }
                if (indexOfCell == 1) {
                    // 第二列因为是污水厂，所以调大点
                    tableCell.setWidth(Long.toString((long) (4 / 2.54 * 1440)));
                } else {
                    tableCell.setWidth(Long.toString((long) (2 / 2.54 * 1440)));
                }
                tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                XWPFParagraph xwpfParagraph = tableCell.getParagraphs().get(0);
                xwpfParagraph.setAlignment(ParagraphAlignment.CENTER);

            }
        }

        //垂直合并第一列
        TableTools.mergeCellsVertically(table, 0, 0, 1);
        TableTools.mergeCellsVertically(table, 1, 0, 1);
        TableTools.mergeCellsVertically(table, 2, 0, 1);
        TableTools.mergeCellsVertically(table, 16, 0, 1);
        // 水平合并 ，这里的代码顺序不能变更，会影响代码的执行
        TableTools.mergeCellsHorizonal(table, 0, 3, 17-2);
        // 合并单元格并填充数据
        mergeTableCellAndFillData(dataMap, table);

//        List<String> tableName2List = new ArrayList<>(Arrays.asList("可替宁","可待因","MDA","MDMA","可卡因","苯甲酰爱康宁","吗啡","O6-单乙酰吗啡","甲基苯丙胺","苯丙胺","氯胺酮","去甲氯胺酮","芬太尼"));
        for (XWPFTableRow tableRow : table.getRows()) {
            switch (table.getRows().indexOf(tableRow)) {
                case 0:
                    tableRow.getCell(0).setText("行政区");
                    tableRow.getCell(1).setText("污水处理厂");
                    tableRow.getCell(2).setText("采样时间");
                    tableRow.getCell(3).setText("浓度（纳克/升）");
                    tableRow.getCell(4).setText("");
                    break;
                case 1:
                    int size = tableRow.getTableCells().size();
                    for (int i = 3; i < size-1; i++) {
                        // 因为第一列的单元格被合并了，所以从第二个开始
                        tableRow.getCell(i).setText(tableName2List.get((i -3) % tableName2List.size()));
                    }
                    break;
            }
        }

    }

    /**
     * 表3 陕西省第二季度各行政区污水厂检出依托咪酯统计表
     * @param document 生成表格的文档对象
     * @param rows 表格的行数
     * @param cols 表格的列数
     * @param tableDataList 表格数据列表
     */
    public static void fetchEtomidateDetectedStatisticalTable(XWPFDocument document, int rows, int cols, List<List<Object>> tableDataList) {
        XWPFTable table = document.createTable(rows, cols);
//            table.setWidth("100%");
        // 创建表格后，添加grid 网格，grid 规定了表格每一列的宽度，对后面合并单元格有作用
        CTTblGrid grid = table.getCTTbl().addNewTblGrid();
        // grid 的宽度单位是 twips， twip 是 point 的 1/20。一英寸有 1440 twips, 一英寸 2.54厘米，
        // 假设我们的表格第一列 4cm，第二列 8cm，那么需要先除以 2.54 得到英寸再乘以 1440 得到 twips。
        for (int i = 0; i < 8; i++) {
            if (i == 7) {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (10 / 2.54 * 1440)));
            } else {
                grid.addNewGridCol().setW(BigInteger.valueOf((long) (2 / 2.54 * 1440)));
            }
        }

        // 给表格设置边框
        setTableBorderAttributes(table);

        List<XWPFTableRow> tableRows = table.getRows();
        for (XWPFTableRow tableRow : tableRows) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRows.indexOf(tableRow);
                int indexOfCell = tableRow.getTableCells().indexOf(tableCell);
                if (indexOf == 0) {
                    tableCell.setColor("bdd7ee"); // 填充单元格颜色
                }
                if (indexOfCell != 7) {
                    tableCell.setWidth(Long.toString((long) (3 / 2.54 * 1440)));
                    tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                    tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
                } else {
                    tableCell.setWidth(Long.toString((long) (12 / 2.54 * 1440)));
                    tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.BOTH);
                    tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.LEFT);
                }
            }
        }

        for (int i = 0; i < tableRows.size(); i++) {
            List<XWPFTableCell> tableCells = tableRows.get(i).getTableCells();
            List list = tableDataList.get(i);
            for (int j = 0; j < tableCells.size(); j++) {
                tableCells.get(j).setText(list.get(j).toString());
            }
        }
    }


    /**
     * 创建word表格
     * @param document
     * @param rows
     * @param cols
     * @return
     */
    private static XWPFTable getXwpfTable(XWPFDocument document, int rows, int cols) {
        // 创建一个一行两列
        XWPFTable table = document.createTable(rows, cols);
//            table.setWidth("100%");
        // 创建表格后，添加grid 网格，grid 规定了表格每一列的宽度，对后面合并单元格有作用
        CTTblGrid grid = table.getCTTbl().addNewTblGrid();
        // grid 的宽度单位是 twips， twip 是 point 的 1/20。一英寸有 1440 twips, 一英寸 2.54厘米，
        // 假设我们的表格第一列 4cm，第二列 8cm，那么需要先除以 2.54 得到英寸再乘以 1440 得到 twips。
        for (int i = 0; i < cols; i++) {
            grid.addNewGridCol().setW(BigInteger.valueOf((long) (2 / 2.54 * 1440)));
        }
        return table;
    }

    /**
     * 根据市的数据量合并单元格和填充数据
     * @param dataMap
     * @param table
     */
    private static void mergeTableCellAndFillData(Map<String, List<List<Object>>> dataMap, XWPFTable table) {
        // 根据数据合并单元格
        AtomicInteger fromRow = new AtomicInteger(2);// 数据开始插入行，比如说表格有0，1两行表头，所以从 第三行 2表头开始
        // 合并单元格 数据填充
        dataMap.forEach((k, v) -> {
            int toRow = fromRow.get() + v.size();
            if (toRow == table.getRows().size()) {
                // 如果是最后一次数据合并，则 -1
                toRow = toRow -1; // 防止下标越界，
            }
            if (v.size() != 1) {
                // 只有当数据量大于1时才需要合并第一列的单元格
                TableTools.mergeCellsVertically(table, 0, fromRow.get(), toRow);
            }
            XWPFTableRow tableRow = table.getRow(fromRow.get());
            tableRow.getCell(0).setText(k);
            Map<String, List<List<Object>>> groupBySewagePlant = new HashMap<>();
            for (List<Object> list : v) {
                if (groupBySewagePlant.containsKey(list.get(0).toString())) {
                    groupBySewagePlant.get(list.get(0)).add(list);
                } else {
                    groupBySewagePlant.put(list.get(0).toString(), new ArrayList<>(Arrays.asList(list)));
                }
            }
            // 取分好类的数据
            List<String> keyList = new ArrayList<>(groupBySewagePlant.keySet());
            int startRow = fromRow.get();
            for (String s : keyList) {
                List<List<Object>> dataMapBySewagePlantList = groupBySewagePlant.get(s);
                if (dataMapBySewagePlantList.size() == 2) {
                    TableTools.mergeCellsVertically(table, 1, startRow, startRow + 1);

                    for (int count = 0; count < dataMapBySewagePlantList.size(); count++) {
                        List<Object> list = dataMapBySewagePlantList.get(count);

                        XWPFTableRow tableDataRow = table.getRow(startRow + count);
                        if (count == 0) {
                            tableDataRow.getCell(1).setText(s.toString());
                        }
                        // 从2开始的原因是 第一个 是行政区， 第二个是污水厂
                        for (int cellIndex = 2; cellIndex < tableDataRow.getTableCells().size(); cellIndex++) {
                            tableDataRow.getCell(cellIndex).setText(list.get(cellIndex - 1).toString());
                        }
                    }

                    startRow = startRow + 2;
                } else {
                    XWPFTableRow tableDataRow = table.getRow(startRow);
                    List<Object> list = dataMapBySewagePlantList.get(0);
                    // 从2开始的原因是 第一个 是行政区， 第二个是污水厂
                    for (int cellIndex = 1; cellIndex < tableDataRow.getTableCells().size(); cellIndex++) {
                        tableDataRow.getCell(cellIndex).setText(list.get(cellIndex - 1).toString());
                    }
                    startRow++;
                }
            }
            fromRow.getAndAdd(v.size());
        });
    }


    /**
     * 设置表格边框属性
     * @param table
     */
    private static void setTableBorderAttributes(XWPFTable table) {
        table.setLeftBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
        table.setRightBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
        table.setTopBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
        table.setBottomBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
        table.setInsideHBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
        table.setInsideVBorder(XWPFTable.XWPFBorderType.SINGLE, 4, 0, "000000");
    }

    /**
     * 设置纸张方向
     * @param section
     * @param orientation 字符串方向
     */
    private static void changeOrientation(CTSectPr section, String orientation) {
        CTPageSz pageSize = section.isSetPgSz() ? section.getPgSz() : section.addNewPgSz();
        // 设置页边距
        CTPageMar ctPageMar = section.isSetPgMar() ? section.getPgMar() : section.addNewPgMar();
        if (orientation.equals(SUBSECTIONTWO)) {
            pageSize.setOrient(STPageOrientation.LANDSCAPE);
            pageSize.setW(BigInteger.valueOf(842 * 20));
            pageSize.setH(BigInteger.valueOf(595 * 20));
            // 设置页边距
//            CTPageMar ctPageMar = section.isSetPgMar() ? section.getPgMar() : section.addNewPgMar();
            ctPageMar.setLeft(new BigInteger((28 * 20) + ""));
            ctPageMar.setTop(new BigInteger((28 * 20) + ""));
            ctPageMar.setRight(new BigInteger((28 * 20) + ""));
            ctPageMar.setBottom(new BigInteger((28 * 20) + ""));
        } else {
            pageSize.setOrient(STPageOrientation.PORTRAIT);
            pageSize.setH(BigInteger.valueOf(842 * 20));
            pageSize.setW(BigInteger.valueOf(595 * 20));
            // 设置页边距 为 上 1.28厘米 左 右 下都是2.4厘米 1 厘米等于28磅
//            CTPageMar ctPageMar = section.isSetPgMar() ? section.getPgMar() : section.addNewPgMar();
//            ctPageMar.setLeft(new BigInteger((67 * 20) + ""));
//            ctPageMar.setTop(new BigInteger((36 * 20) + ""));
//            ctPageMar.setRight(new BigInteger((67 * 20) + ""));
//            ctPageMar.setBottom(new BigInteger((67 * 20) + ""));
        }
    }

    /**
     * 根据表格的所有行遍历单元格设置单元格属性
     * @param tableRowList
     */
    private static void setTableCellAttribute(List<XWPFTableRow> tableRowList) {
        for (XWPFTableRow tableRow : tableRowList) {
            for (XWPFTableCell tableCell : tableRow.getTableCells()) {
                int indexOf = tableRowList.indexOf(tableRow);
                if (indexOf == 1 || indexOf == 0) {
                    tableCell.setColor("bdd7ee"); // 填充单元格颜色
                }
                tableCell.setWidth(Long.toString((long) (2 / 2.54 * 1440)));
                tableCell.setVerticalAlignment(XWPFTableCell.XWPFVertAlign.CENTER);
                tableCell.getParagraphs().get(0).setAlignment(ParagraphAlignment.CENTER);
            }
        }
    }

}
