2

我想知道java中是否有办法编辑excel文件。例如:如果我填充了一个 Excel 表,我可以更改某些单元格的值而保留其他单元格的值吗?先感谢您

4

6 回答 6

4

我对 Apache POI 库有一些不错的结果:http: //poi.apache.org/

它甚至可以在 Android 上运行。

于 2012-09-25T09:58:49.563 回答
4

JXL旨在提高读取效率(因为这是 API 的主要用途)。为了提高性能,与输出信息相关的数据(例如,所有格式信息,如字体)在读取电子表格时不会被解释,因为在询问原始数据值时这是多余的。

但是,如果我们需要修改此电子表格,则需要各种写入接口的句柄,可以使用 copy 方法获得。

Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));
WritableWorkbook copy = Workbook.createWorkbook(new File("temp.xls"), workbook);

这会复制已读入的信息,并执行附加处理以解释编写电子表格所需的字段。这种读取优化策略的缺点是我们在内存中保存了两个电子表格,而不仅仅是一个,因此内存需求增加了一倍。

但在这之后,你可以为所欲为。像:

WritableSheet sheet2 = copy.getSheet(1); 
WritableCell cell = sheet2.getWritableCell(1, 2); 

if (cell.getType() == CellType.LABEL) 
{ 
  Label l = (Label) cell; 
  l.setString("modified cell"); 
}
copy.write(); 
copy.close();
workbook.close();
于 2012-09-25T09:59:53.730 回答
3

是的,您可以使用 Andy Khan 的JExcel库很好地做到这一点。

于 2012-09-25T09:56:56.647 回答
1

是的,您可以使用Apache POI API 编辑 Excel 工作表

于 2012-09-25T09:57:34.803 回答
0

使用可以使用 JXL 来做到这一点

JXL 没有提供读取和写入同一个文件的直接方式(对您来说可能看起来不方便,但 JXL 说这是因为读取是主要功能(主要使用),这可以提高性能,但我更喜欢读写我自己的工作簿)

例子

import java.io.File; 
import java.util.Date; 
import jxl.*; 
import jxl.write.*; 

//open read to your workbook (readonly)
Workbook workbook = Workbook.getWorkbook(new File("myfile.xls"));

//create a copy workbook on which you will write
WritableWorkbook copy = Workbook.createWorkbook(new File("output.xls"), workbook);

//modify existing cell 
WritableSheet sheet2 = copy.getSheet(1); 
WritableCell cell = sheet2.getWritableCell(2, 4); 

NumberFormat fivedps = new NumberFormat("#.#####"); 
WritableCellFormat cellFormat = new WritableCellFormat(fivedps); 
cell.setFormat(cellFormat);

//add cells 
Label label = new Label(0, 2, "New label record"); 
sheet2.addCell(label); 

Number number = new Number(3, 4, 3.1459); 
sheet2.addCell(number);
于 2012-09-25T10:12:20.930 回答
0

您必须编写一些实用程序来执行此操作,但是可以在 JXL 中执行此操作。

请注意 SheetCopier.java 中有一个错误,L996+997: 错误:

    if (c.getCellFeatures() != null &
        c.getCellFeatures().hasDataValidation())

应该:

    if (c.getCellFeatures() != null &&
        c.getCellFeatures().hasDataValidation())

由于我没有 Andy Khans 的电子邮件,我无法联系到他,所以也重建资源。

作为旁注,Apache poi 对于凡人来说太复杂了,类名也很荒谬,而且根据我的经验,apache 代码不友好、无用且不健壮。所以我尽可能避免使用apache。

于 2013-01-16T23:25:55.467 回答