#前言
需求是将一个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正序删除,逆序会导致原有顺序杂乱)