Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.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 在ApachePOI中移动单元格_Java_Apache Poi - Fatal编程技术网

Java 在ApachePOI中移动单元格

Java 在ApachePOI中移动单元格,java,apache-poi,Java,Apache Poi,我正在尝试使用ApachePOI实现insertColumn功能。据我所知,实现这一点的唯一方法是对工作表中的所有行进行迭代,然后将每个行中的每个单元格移动1个单元格,然后在所需列索引处的行中创建一个新的单元格 但是,我注意到只有HSSFRow有moveCell()方法,而XSSFRow没有-moveCell只为HSSF实现有什么原因吗?是否有原因无法将其添加到工作表接口并针对这两种工作表类型实现(因为我们的代码使用这些接口是为了同时支持.xls和.xslx文件类型) 编辑: 在实现了一个单元格

我正在尝试使用ApachePOI实现
insertColumn
功能。据我所知,实现这一点的唯一方法是对
工作表中的所有
进行
迭代
,然后将每个
中的每个
单元格
移动1个
单元格
,然后在所需列索引处的行中创建一个新的
单元格

但是,我注意到只有
HSSFRow
moveCell()
方法,而
XSSFRow
没有-moveCell只为HSSF实现有什么原因吗?是否有原因无法将其添加到
工作表
接口
并针对这两种
工作表
类型实现(因为我们的代码使用这些接口是为了同时支持.xls和.xslx文件类型)

编辑:


在实现了一个单元格一个单元格、一行一行的移动之后,很明显这对公式不起作用,因为引用没有更新。我终于找到了一个开源LGPL库,它比POI-openxls更好地处理这个问题。在使用这个库几个星期后,我不推荐使用这个库。我们遇到了一个又一个bug,并且花了比开发应用程序代码更多的时间修复bug并将bug推送到我们的公共git repo上。

在查看这两种表单时,您看到这种不同行为的原因是.xls和.xlsx文件的结构有很大的不同。因此,简单地说‘是否不可能将其添加到工作表接口’是的,是的,这是可能的,但也有可能添加此附加功能非常重要。请参阅,了解他们为什么切换到.xlsx的详细说明。如果您真的想变得有趣,请将whateverMyFileis.xlsx文件的名称更改为whateverMyFileis.zip>,然后将其解压缩,您就可以看到他们如何将文件中的所有内容分解的真实程度。然而,如果你为.xls这样做,它什么也做不了


关于问题的第一部分,您询问了如何实现insertColumn功能。这给您带来麻烦的原因是,excel工作表本质上是基于行的,而ApachePOI不太支持列。几乎所有涉及基于列的逻辑的事情都必须由您来实现。因此,为了回答您提出的关于创建专栏的唯一方法的问题,我同意,我没有立即找到更好的方法。

在查看这两种表格时,您会看到这种不同的行为,因为.xls和.xlsx文件的结构有很大的不同。因此,简单地说‘是否不可能将其添加到工作表接口’是的,是的,这是可能的,但也有可能添加此附加功能非常重要。请参阅,了解他们为什么切换到.xlsx的详细说明。如果您真的想变得有趣,请将whateverMyFileis.xlsx文件的名称更改为whateverMyFileis.zip>,然后将其解压缩,您就可以看到他们如何将文件中的所有内容分解的真实程度。然而,如果你为.xls这样做,它什么也做不了


关于问题的第一部分,您询问了如何实现insertColumn功能。这给您带来麻烦的原因是,excel工作表本质上是基于行的,而ApachePOI不太支持列。几乎所有涉及基于列的逻辑的事情都必须由您来实现。因此,要回答您提出的关于您能看到的唯一方法的问题,我同意,我认为没有更好的方法来创建专栏。

谢谢。关于如何使用当前POI版本(我有一个HSSF解决方案)移动XSSF行中的单元格(或直接插入一个新单元格)的任何看法,而不是:在末尾插入新单元格,将最后一个单元格复制到新的结尾单元格,并对行中的所有单元格重复。嗯,您可能最幸运地将整行解析到容器中,然后编辑该容器,删除旧行,并在与容器中已编辑数据相同的位置创建新行。如果行很大,您可能需要找到一个更优雅的解决方案,但是apachepoi经过了很好的优化,因此除了非常大的excel文件之外,您不应该看到性能的大幅下降。关于如何使用当前POI版本(我有一个HSSF解决方案)移动XSSF行中的单元格(或直接插入一个新单元格)的任何看法,而不是:在末尾插入新单元格,将最后一个单元格复制到新的结尾单元格,并对行中的所有单元格重复。嗯,您可能最幸运地将整行解析到容器中,然后编辑该容器,删除旧行,并在与容器中已编辑数据相同的位置创建新行。如果行很大,您可能需要找到一个更优雅的解决方案,但是ApachePOI经过了很好的优化,因此,除了非常大的excel文件之外,您不应该看到性能的大幅下降