import java.nio.file.*; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; class ExtractStockXls { static String q(String s){return "\""+s.replace("\\","\\\\").replace("\"","\\\"").replace("\r","\\r").replace("\n","\\n").replace("\t","\\t")+"\"";} public static void main(String[] a)throws Exception{ StringBuilder o=new StringBuilder("["); try(var w=new HSSFWorkbook(Files.newInputStream(Path.of(a[0])))){ for(int si=0;si0)o.append(',');o.append("{\"sheet\":").append(q(s.getSheetName())).append(",\"rows\":["); for(int ri=0;ri<=s.getLastRowNum();ri++){ if(ri>0)o.append(',');o.append('[');var r=s.getRow(ri); if(r!=null)for(int ci=0;ci0)o.append(',');var c=r.getCell(ci);if(c==null){o.append("null");continue;} var t=c.getCellType()==CellType.FORMULA?c.getCachedFormulaResultType():c.getCellType(); switch(t){ case NUMERIC -> o.append(java.math.BigDecimal.valueOf(c.getNumericCellValue()).stripTrailingZeros().toPlainString()); case STRING -> o.append(q(c.getStringCellValue())); case BOOLEAN -> o.append(c.getBooleanCellValue()); case ERROR -> o.append("{\"error\":").append(q(FormulaError.forInt(c.getErrorCellValue()).getString())).append('}'); default -> o.append("null"); } }o.append(']'); }o.append("],\"merged\":[");for(int i=0;i0)o.append(',');o.append(q(s.getMergedRegion(i).formatAsString()));}o.append("]}"); } }o.append(']');Files.writeString(Path.of(a[1]),o.toString()); } }