解决导出时FontConfiguration报空指针异常.
报错信息如下:
java.lang.NullPointerException: null
at sun.awt.FontConfiguration.getVersion(FontConfiguration.java:1264)
at sun.awt.FontConfiguration.readFontConfigFile(FontConfiguration.java:219)
at sun.awt.FontConfiguration.init(FontConfiguration.java:107)
at sun.awt.X11FontManager.createFontConfiguration(X11FontManager.java:776)
at sun.font.SunFontManager$2.run(SunFontManager.java:431)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.SunFontManager.<init>(SunFontManager.java:376)
at sun.awt.X11FontManager.<init>(X11FontManager.java:57)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at java.lang.Class.newInstance(Class.java:442)
at sun.font.FontManagerFactory$1.run(FontManagerFactory.java:83)
at java.security.AccessController.doPrivileged(Native Method)
at sun.font.FontManagerFactory.getInstance(FontManagerFactory.java:74)
at java.awt.Font.getFont2D(Font.java:491)
at java.awt.Font.canDisplayUpTo(Font.java:2060)
at java.awt.font.TextLayout.singleFont(TextLayout.java:470)
at java.awt.font.TextLayout.<init>(TextLayout.java:531)
at org.apache.poi.ss.util.SheetUtil.getDefaultCharWidth(SheetUtil.java:275)
at org.apache.poi.xssf.streaming.AutoSizeColumnTracker.<init>(AutoSizeColumnTracker.java:117)
at org.apache.poi.xssf.streaming.SXSSFSheet.<init>(SXSSFSheet.java:82)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createAndRegisterSXSSFSheet(SXSSFWorkbook.java:658)
at org.apache.poi.xssf.streaming.SXSSFWorkbook.createSheet(SXSSFWorkbook.java:679)
at com.cgnpc.ssc.datastatisticsserver.framework.utils.PoiUtils.writeExcelSheets(PoiUtils.java:167)
at com.cgnpc.ssc.datastatisticsserver.framework.utils.PoiUtils.exportSXSSF(PoiUtils.java:143)
报错原因是:
导出文件使用的是org.apache.poi.xssf.streaming下的SXSSFWorkbook,提示服务器字体库丢失文件。
解决方案:
换成了org.apache.poi.xssf.usermodel下的XSSFWorkbook,这样就可以导出了。
这两个类都实现了都是实现了Workbook接口,以上问题就解决了,下面附赠导出后续代码
XSSFWorkbook wb = ExcelUtils.writeExcel(sheetName, title, content, col, data);
OutputStream os = null;
try {
HttpServletResponse response = HttpServlet.getResponse();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
//前端好像获取不到filename
response.setHeader("Content-Disposition", "attachment;filename=" + new String(fileName.getBytes("utf-8"), "ISO8859-1"));
os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
LogUtils.error(e.getMessage());
} finally {
if (os != null) {
os.flush();
os.close();
}
}