使用SXSSFWorkbook读取Excel,内存无法释放?

使用SXSSFWorkbook读取Excel,1W行数据,188列(测试时只有前16列有数据)
读取操作完成后,JVM中存在大量的org.apache.xmlbeans.impl.store.Xobj$AttrXobj org.apache.xmlbeans.impl.store.Xobj$ElementXob类的实例,很长时间内不会被GC

@RestController

public class Test4 {

@GetMapping("/hello")

public String hello() {

// 标题栏行数

int hDefine = 7;

// 有效数据列

int headerSize = 188;

// 最大读取行数

int maxDataRow = 10000;

// 行号列

int rowNumDefine = 2;

try (

XSSFWorkbook wb = new XSSFWorkbook("D:\\Test.xlsx");

SXSSFWorkbook swb = new SXSSFWorkbook(wb, 100);

XSSFWorkbook newXssfWorkbook = swb.getXSSFWorkbook()) {

Sheet sheet = newXssfWorkbook.getSheetAt(0);

DataFormatter formatterExcel = new DataFormatter();

int i;

int j;

Row row;

Cell cell;

boolean isEmptyRow;

for (i = hDefine; i < maxDataRow + hDefine; i++) {

row = sheet.getRow(i);

if (row == null) {

break;

}

isEmptyRow = true;

List<String> rowString = new ArrayList<>();

for (j = rowNumDefine; j < headerSize + rowNumDefine; j++) {

cell = row.getCell(j);

String stringValue = "";

if (cell != null && !isBlankOrNull(formatterExcel.formatCellValue(cell))) {

isEmptyRow = false;

String text = formatterExcel.formatCellValue(cell);

FontColor textColor = getCellTextColor(swb, cell);

String formatter = textColor.getHtmlFormatter();

stringValue = String.format(formatter, text);

}

rowString.add(stringValue);

}

if (isEmptyRow) {

break;

}

// 省略其他业务代码

}

swb.dispose();

} catch (EncryptedDocumentException | IOException e) {

throw new RuntimeException("导入时发生错误", e);

}

return "hello";

}

public static boolean isBlankOrNull(String str) {

return str == null || str.trim().isEmpty();

}

public static FontColor getCellTextColor(Workbook wk, Cell cell) {

FontColor textColor = FontColor.BLACK;

if (cell == null) {

return textColor;

}

CellStyle cellStyle = cell.getCellStyle();

Font font = wk.getFontAt(cellStyle.getFontIndexAsInt());

XSSFColor color = Optional.ofNullable(((XSSFFont) font).getXSSFColor())

.orElse(new XSSFColor(new java.awt.Color(0, 0, 0), new DefaultIndexedColorMap()));

byte[] rgb = color.getRGB();

textColor = FontColor.valueOf(rgb);

return textColor;

}

public enum FontColor {

BLACK, RED, BLUE;

public String getHtmlFormatter() {

switch (this) {

case BLACK:

return "%s";

case RED:

return "<span style=\"color: red;\">%s</span>";

case BLUE:

return "<span style=\"color: blue;\">%s</span>";

}

return "%s";

}

public static FontColor valueOf(byte[] rgb) {

FontColor ret = FontColor.BLACK;

int red = (rgb[0] < 0) ? (rgb[0] + 256) : rgb[0];

int green = (rgb[1] < 0) ? (rgb[1] + 256) : rgb[1];

int blue = (rgb[2] < 0) ? (rgb[2] + 256) : rgb[2];

if (red == 255 && green == 0 && blue == 0) {

ret = FontColor.RED;

} else if (red == 0 && green == 0 && blue == 255) {

ret = FontColor.BLUE;

}

return ret;

}

}

}

我尝试过使用SAX事件驱动解析Excel、StreamingReader读取Excel。
但是实现过程中,都发现似乎并不能获取到单元格的字体的颜色样式(或者是我菜鸡没找到相应的方法)
(PS:客户的要求,单元格内给字体设置颜色,然后读取这个颜色样式进而生成html颜色样式,大雾....)

请问:
1.SAX事件驱动解析Excel、StreamingReader读取Excel是否可以获取到某个单元格的字体的颜色样式?
2.上述这种疑似内存泄漏的问题的原因是我代码的问题吗?

以上是 使用SXSSFWorkbook读取Excel,内存无法释放? 的全部内容, 来源链接: utcz.com/p/945518.html

回到顶部