原因:
poi版本 4.1.2
设置RichTextString 的时候,给 font 设置 setBold(true) ; setItalic(true) 粗体 斜体 ,发现在office有效果,在wps 看不到加粗斜体效果。后来在电脑上wps新建的xlsx和程序生成的xlsx解压,对比sharedString.xml文件发现,电脑的生成的xlsx的加粗斜体是
<b/>
<i/>
而程序生成的加粗斜体是
<b val="true"/>
<i val="true"/>
程序生成的标签里多了属性val,手工删除属性替换,再以xslx表格打开,发现就有效果了
现在知道了原因了,就查看代码处理代码不生成这个属性就好了
解决方法:
方法1、简单粗暴
重写RIchTextString的以下两个方法,这两个方法除了被注释的地方改写,其他地方和父类XSSFRichTextString的一样,使用的时候就使用重写的RichTextString,并且调用append方法设置内容以及对应字体样式

方法2、其实就是 方法1中提到的append设置之后把属性抹去
richTextString.applyFont(index, endIndex, font);
CTRPrElt ctrElt = null;
if(excelStyle.getFont() != null){
if(excelStyle.getFont().isBold()){
List<CTRElt> CTRElt = richTextString.getCTRst().getRList();
if(CTRElt != null && CTRElt.size()>0){
ctrElt = CTRElt.get(CTRElt.size() - 1).getRPr();
if(ctrElt != null){
List<CTBooleanProperty> d = ctrElt.getBList();
if(d != null && d.size() > 0){
d.get(d.size() - 1).unsetVal();
}
}
}
}
if(excelStyle.getFont().isItalic()){
if(ctrElt == null){
List<CTRElt> CTRElt = richTextString.getCTRst().getRList();
if(CTRElt != null && CTRElt.size()>0){
ctrElt = CTRElt.get(CTRElt.size() - 1).getRPr();
}
}
if(ctrElt != null){
List<CTBooleanProperty> d = ctrElt.getIList();
if(d != null && d.size() > 0){
d.get(d.size() - 1).unsetVal();
}
}
}
}
博客介绍了在使用Apache POI 4.1.2版本时,创建的Excel文件在WPS中显示加粗斜体样式失效的问题。作者通过对比电脑上正常创建的xlsx文件和程序生成的文件,发现了问题在于加粗斜体的XML标签格式不同。程序生成的文件中,加粗和斜体属性带有`val=true`,而正常文件中没有该属性。通过重写`RichTextString`的某些方法或直接删除属性来解决此问题,使得样式在WPS中能正确显示。
2486

被折叠的 条评论
为什么被折叠?



