我期待使用Java以编程方式写入excel(.xls MS Excel 2003格式)文件.excel输出文件可能包含~200,000行,我打算将其分成多张纸(由于excel限制,每张64k行).
我尝试过使用apache POI API,但由于API对象模型,它似乎是一个内存耗尽.我被迫将单元格/工作表添加到内存中的工作簿对象中,只有添加了所有数据后,我才能将工作簿写入文件!以下是apache建议如何使用API编写excel文件的示例:
Workbook wb = new HSSFWorkbook();
Sheet sheet = wb.createSheet("new sheet");
//Create a row and put some cells in it
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
Run Code Online (Sandbox Code Playgroud)
显然,编写~20k行(每行有10-20列)给了我可怕的"java.lang.OutOfMemoryError:Java堆空间".
我尝试使用Xms和Xmx参数将XVM初始堆大小和最大堆大小增加为Xms512m和Xmx1024.仍然无法向文件写入超过150k行.
我正在寻找一种流式传输到excel文件的方法,而不是在将其写入磁盘之前在内存中构建整个文件,这有望节省大量内存.任何替代API或解决方案都将受到赞赏,但我仅限于使用java.谢谢!:)
我需要从我的Java代码创建excel表,其中包含使用Apache POI库的条形图,折线图等图表.可能吗?我无法找到相同的任何有用的代码示例.
除了Java的POI库之外,还有其他替代方法吗?
我刚才有一个关于如何使用Apache的XSSF格式读取xlsx文件的快速问题.
现在我的代码看起来像这样:
InputStream fs = new FileInputStream(filename); // (1)
XSSFWorkbook wb = new XSSFWorkbook(fs); // (2)
XSSFSheet sheet = wb.getSheetAt(0); // (3)
Run Code Online (Sandbox Code Playgroud)
......导入了所有相关的东西.我的问题是,当我点击运行时,它会陷入第(2)行,几乎是无限循环.filename只是一个字符串.
如果有人能给我一些关于如何解决这个问题的示例代码,我将非常感激.我现在想要的只是从xlsx文件中读取单个单元格; 我使用HSSF用于xls文件并且没有问题.
谢谢你的帮助,安德鲁
我的文件是9MB,我在加载工作簿时遇到此错误.
XSSFWorkbook workbook = new XSSFWorkbook(excelFilePath);
Run Code Online (Sandbox Code Playgroud)
这条线导致 java.lang.OutOfMemoryError: Java heap space
我怎么解决这个问题?
使用JDK 1.6,JSF 2.1,PrimeFaces 2.2.1,POI 3.2和Apache Tomcat 7
我正在尝试设置一个servlet,允许根据用户选择下载excel文件.excel文档在运行时创建.
没有错误,代码确实进入了servlet.
我点击按钮,没有任何反应.我没有使用PrimeFaces使用的数据表导出,因为我需要对Excel文档中的数据进行重新排序和自定义格式化.
ExportExcelReports.java
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=\"my.xls\"");
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue(0.0);
FileOutputStream out = new FileOutputStream("my.xls");
workbook.write(out);
out.close();
}
Run Code Online (Sandbox Code Playgroud)
ProjectReportBean.java
public void getReportData() {
try {
FacesContext ctx = FacesContext.getCurrentInstance();
ExternalContext ectx = ctx.getExternalContext();
HttpServletRequest request = (HttpServletRequest) ectx.getRequest();
HttpServletResponse response = (HttpServletResponse) ectx.getResponse();
RequestDispatcher dispatcher = request.getRequestDispatcher("/ExportExcelReports"); …Run Code Online (Sandbox Code Playgroud) 如何在Apache poi中的两个不同工作簿之间复制工作表?
引用此线程时缺少该方法.没有这样的解决方案.
是否可以在流式SXSSFWorkbook上使用autoSizeColumns?我实现了导出功能,以将对象列表导出为excel.起初我使用了XSSFWorkbook(不是流式传输),在创建了所有单元格之后,我自动化了所有列,产生了一个很好的excel文件.
对于性能问题,我们希望将工作簿更改为流式版本,但这会在org.apache.poi.ss.util.SheetUtil.getCellWidth中生成NullPointer.
是否可以为SXSSFWorkbook调用autoSizeColumns?
我使用的是poi-ooxml 3.9,但我在3.8中遇到了同样的问题.
我正在使用HSSF-POI来读取Excel数据.问题是我在单元格中的值看起来像一个数字,但实际上是字符串.如果我在Excel中查看格式单元格,则表示类型为"text".HSSF Cell仍然认为它是数字的.如何将值作为字符串获取?
如果我尝试使用cell.getRichStringValue,我会得到例外; 如果cell.toString,它与Excel表格中的值不完全相同.
编辑:直到这个解决,我会用
new BigDecimal(cell.getNumericCellValue()).toString()
Run Code Online (Sandbox Code Playgroud) 我想在Excel工作表中存储数字数据.
数字数据在我的java代码中由String类型表示.
是否可以将其设置为数字而不进行投射?
我已经尝试了以下代码,但它没有转换为数字类型(我在excel中收到一条警告,说该号码存储为文本...)
HSSFCell dCell =...
dCell.setCellType(Cell.CELL_TYPE_NUMERIC);
dCell.setCellValue("112.45")
Run Code Online (Sandbox Code Playgroud) 我想加载一个模板word文档来添加内容并保存为新文档.我正在研究.doc文件.
经过长时间的研究,我只找到了docx的解决方案:
http://www.smartjava.org/content/create-complex-word-docx-documents-programatically-docx4j
http://www.sambhashanam.com/mail-merge-in-java-for-microsoft-word-document-part-i/
所以我想替换以这种格式编写的任何变量:$VAR它的值.我可以用velocity或Apache-poi来做,它的最佳解决方案是什么.任何帮助将不胜感激.