Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java,修改excel文件_Java_Excel - Fatal编程技术网

Java,修改excel文件

Java,修改excel文件,java,excel,Java,Excel,我想知道java中是否有编辑excel文件的方法。 例如:如果填充了excel工作表,我可以更改某些单元格的值,而保留其他单元格的值? 提前感谢您是的,您可以使用Andy Khan的库很好地完成这项工作。是的,您可以使用API编辑excel工作表我对Apache POI库有一些不错的结果: 它甚至可以在Android上运行。JXL是为提高读取效率而设计的(因为这是API的主要用途)。为了提高性能,在读取电子表格时不解释与输出信息(例如,字体等所有格式信息)相关的数据,因为这在查询原始数据值时是多

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

是的,您可以使用Andy Khan的库很好地完成这项工作。

是的,您可以使用API编辑excel工作表

我对Apache POI库有一些不错的结果:


它甚至可以在Android上运行。

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

但是,如果我们需要修改此电子表格,则需要各种写入接口的句柄,这可以通过复制方法获得

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();

可以使用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);

您必须编写一些实用程序来实现这一点,但是可以在JXL中实现

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

应该是:

    if (c.getCellFeatures() != null &&
        c.getCellFeatures().hasDataValidation())
由于我没有安迪·坎斯的电子邮件,我无法联系他,所以也要重建来源


顺便说一句,ApachePOI对于凡人来说太复杂了,类名也很荒谬,以我的经验,Apache代码不友好、没有帮助,而且不健壮。因此,我尽可能避免使用apache。

请从此问题中删除itext标记。iText没有任何XLS功能。您尝试过什么?你在用图书馆吗?哪一个?发布一些代码片段,说明您对它做了一些研究。您能给我举个简单的例子吗?请:)来吧,伙计。至少看看文件,试试安迪给你的东西。除了抱怨之外,您还需要付出一些努力。@duffymo那个API不是过时了吗?你知道它也适用于2003年之后发布的产品吗?Apache POI确实很方便。在itext中,我可以这样做吗?坦率地说,我使用itext for pdf,但我用JXLI完美地做到了这一点。我知道这已经有半年了,但受到你在头版上关于你的帐户被锁定的帖子的启发,我需要让您知道,这段代码会像编写的一样正常工作。根据语言规范,如果按位运算符的输入是布尔的,则结果是布尔运算。这应该可以很好地工作。@John,很明显,&“计算两个部分,&&&”使用惰性计算。如果c.getCellFeatures()==null,则带&的表达式将中断,因为“c.getCellFeatures().hasDataValidation()”也将被计算,导致NPE不是预期的结果,否则代码部分“c.getCellFeatures()!=null”将不再需要。我只想说jxl是一个非常好用的库,比ApachePOI更简单,所以要快速启动并运行程序,应该使用jxl。然而,ApachePOI支持较新的excel,但在原型阶段,您将被其复杂性所困扰。谢谢你的解释!
    if (c.getCellFeatures() != null &&
        c.getCellFeatures().hasDataValidation())