背景
由于最近楼主做的是新冠检测相关的系统,其中有涉及导出Excel的需求。按平时封装的导出工具类基本也就满足了,但是最近来了一个要求某些列要有上下标,所以给大家贴出上下标的关键代码,以后抄作业的时候可以快速找到,不要在这个问题上浪费太多时间。
代码时间
public static void main(String[] args) throws IOException, IOException {
//创建标题
List<TableHeader> tableHeaderList = new ArrayList<>();
{
TableHeader tableHeader = new TableHeader();
tableHeader.setName("学习上标");
tableHeader.setKey("studySuper");
tableHeaderList.add(tableHeader);
}
//创建内容
List<TableFooter> footerList = new ArrayList<>();
{
TableFooter footer = new TableFooter();
Map<String, Object> data = new LinkedHashMap<>();
data.put("studySuper", "-α3.7/αα");
footer.setData(data);
//======todo 重点代码 start=============
AbstractCellStyleHolder dataCellStyleHolder = (sheet, cell) -> {
if (cell.getCellType() == CellType.STRING) {
//todo 核心代码 真正上下标起作用的
RichTextString richTextString = new HSSFRichTextString(cell.getStringCellValue());
Font font = sheet.getWorkbook().createFont();
font.setTypeOffset(HSSFFont.SS_SUPER);
richTextString.applyFont(2,5,font);
cell.setCellValue(richTextString);
}
//自适应内容宽度
sheet.setColumnWidth(cell.getColumnIndex(),(cell.toString().getBytes().length+4) * 256);
};
//=======todo 重点代码 end===============
footer.setStyleHolder(dataCellStyleHolder);
footerList.add(footer);
}
//输出
Workbook workbook = ExcelGenerateUtil.excelGenerate("测试上下标", tableHeaderList, footerList);
String randomStr = RandomStringUtils.randomNumeric(3);
System.out.println(randomStr);
workbook.write(new FileOutputStream("c:/test/up"+ randomStr +".xls"));
}
这是楼主自己封装的excel生成的工具类,其余部分不用去看,就是为了造个标题,造个内容。最最核心的起到上下标的代码如下:
//todo 核心代码 真正上下标起作用的
RichTextString richTextString = new HSSFRichTextString(cell.getStringCellValue());
Font font = sheet.getWorkbook().createFont();
font.setTypeOffset(HSSFFont.SS_SUPER);
richTextString.applyFont(2,5,font);
cell.setCellValue(richTextString);
要创建一个RichTextString
类,实现子类用HSSFRichTextString
,其他子类也试过,好像有点效果不太好,其他不需要上标的字体也会受点影响,所以没进行使用。
首先先创建一个字体类Font
Font font = sheet.getWorkbook().createFont();
其次,设置类型偏移setTypeOffset
方法
//上移:HSSFFont.SS_SUPER 下移:HSSFFont.SS_SUB
font.setTypeOffset(HSSFFont.SS_SUPER);
最后应用到richTextString
中
richTextString.applyFont(2,5,font);
applyFont(int startIndex,int endIndex,Font font);
- startIndex:目标内容从什么位置开始进行上下标
- endIndex:目标内容从什么位置结束上下标(跟subString方法有点类似,这个endIndex是包前不包后)
- font: 就是你辛辛苦苦设置的上面的创建出来要上标还是下标的Font对象
这样就可以正常实现上下标了,以上代码效果图如下。