#前言
需求是将一个excel表格数据源转为其他样式的文档,我是直接sprie.xls将其转为pdf进行展示
首先,我在创建的springboot项目中的pom文件中导入相关依赖

<dependency>
            <groupId>e-iceblue</groupId>
            <artifactId>spire.xls.free</artifactId>
            <version>5.1.0</version>
        </dependency>
</dependencies>

再application.properties配置文件中引入数据源的路径

excel_path =C:/Users/xxx.xlsx
pdf_path =C:/Users/xxx.pdf

后端代码:

public class SpireXLSController {
	//从properties中获取路径值
    @Value("${excel_path}")
    private String excelPath;//读取excel,excel路径
    @Value("${pdf_path}")
    private String pdfPath;//写入pdf路径
    @RequestMapping("/text")
    public String Test01(){
        //加载excel表格
        Workbook workbook = new Workbook();
        workbook.loadFromFile(excelPath);
        //获取第一个工作表
        Worksheet worksheet = workbook.getWorksheets().get(0);
        //删除多余字段
        worksheet.deleteColumn(1,2);
        worksheet.deleteColumn(5,2);
        //将含有Y放到上方
        workbook.getDataSorter().getSortColumns().add(1, SortComparsionType.Values, OrderBy.Top);
        workbook.getDataSorter().getSortColumns().add(2, SortComparsionType.Values, OrderBy.Ascending);

        //指定需要排序的列索引以及排序的方式(基于单元格的值)
        //获取有数据的区域
        CellRange dataRange =worksheet.getAllocatedRange();
        //使用条件格式将数据为Y的背景色设为绿色
        ConditionalFormatWrapper format1 = dataRange.getConditionalFormats().addCondition();
        format1.setFormatType(ConditionalFormatType.Formula);
        format1.setFirstFormula("=IF($B1=\"Y\",true,false)");
        format1.setBackColor(Color.green);
        //使用条件格式将数据为N有编号的背景色设为黄色
        ConditionalFormatWrapper format2 = dataRange.getConditionalFormats().addCondition();
        format2.setFormatType(ConditionalFormatType.Formula);
        format2.setFirstFormula("=AND(IF($A1=\"\",false,true),IF($B1=\"N\",true,false))");
        format2.setBackColor(Color.yellow);
        //使用条件格式将数据为N无编号的背景色设为红色
        ConditionalFormatWrapper format3 = dataRange.getConditionalFormats().addCondition();
        format3.setFormatType(ConditionalFormatType.Formula);
        format3.setFirstFormula("=AND(IF($A1=\"\",true,false),IF($B1=\"N\",true,false))");
        format3.setBackColor(Color.pink);
        //排序是否包含标题(默认第一个数据为标题,不会对它进行排序)
        workbook.getDataSorter().isIncludeTitle(true);
        //指定要排序的单元格范围并进行排序
        workbook.getDataSorter().sort(worksheet.getRange());
        //设置转换后的PDGF页面高宽适应工作表的内容大小
        workbook.getConverterSetting().setSheetFitToPage(true);
        //设置转换后PDF的页面宽度适应工作表的内容宽度
        workbook.getConverterSetting().setSheetFitToWidth(true);
        //复制workbook
        //遍历所有行
        int count = 0;
        int lastRow = worksheet.getLastRow();
        for (int i =1;i<=lastRow;i++) {
            //判断行是否空白
            if(worksheet.getCellRange(i,1).isBlank()){
                count++;
                CellRange cellRange = worksheet.getCellRange(i, 1, i, worksheet.getLastColumn());
                CellRange range = worksheet.getCellRange(worksheet.getLastRow() + 1, 1, worksheet.getLastRow() + 1, worksheet.getLastColumn());
                worksheet.copy(cellRange,range,true);
            }
        }
        for (int i = worksheet.getLastRow()-count; i > 0; i--) {
            if(worksheet.getCellRange(i,1).isBlank()){
                //删除指定行
                worksheet.deleteRow(i);
            }
        }
        //将生成的文档保存到指定路径
        workbook.saveToFile(pdfPath, FileFormat.PDF);
        return "index.html";
    }
}

总结
1:以上就是全部代码了,代码逻辑的话就比较繁琐,spire.xls直接从excel读取到背景颜色时可以按照背景颜色排序,但如果自己设置完format.setBackColor不可以直接调用方法排序,所以我先按某个条件字段进行排序固定位置,然后再设置背景色(先设背景颜色后就无法移动,所以只能先排序,再设置)
2:按照某个字段值设置颜色(如果是数字类型的话可以直接比较,如果是字符串,而且这涉及到两个字段才能决定所以用的公式)最终效果是上面绿色,下面是红色和黄色夹杂到一起,难以分离,最初想通过两个excel或者两个sheet删除异步分数据copy在一块,但因为限制实现不了,最终按照正序进行分别按条件隔条复制删除(@1先赋值变量,再删除后将变量值copy到最后是获取不到数据的所以只能先copy再delete指定行,@2正序删除,逆序会导致原有顺序杂乱)