- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想将 SXSSF 转换器与 JXLS 一起使用。我试图以这样一种方式编写我的模板,即我不会得到“试图在已经写入磁盘的范围内写入一行”异常。该模板捕获已知列(例如“HEADER 0”)和未知列(以“_dynamic”结尾的列)。动态列的数量可能因运行而异。
如果我将 SXSSF 窗口配置为大于行数,我没有问题。如果我将窗口设置为少于行数,则会出现“正在尝试写入一行...”异常。但是,在这两种情况下都会创建工作簿。如果窗口大小足够大,已知列(“HEADER 0”)将包含在结果中。如果窗口大小不合适,已知的列值会出现在结果中(尽管有异常(exception)),但实际的列文本(同样是“HEADER 0”)会丢失。
我想采用这样的方法,因为行数可能达到 100,000,并且我想在必要时将数据刷新到磁盘。
在 JXLS 中甚至可以做这样的事情吗?如果是这样,是否有方法可以更改模板而无需编写任何了解数据的 Java 代码?
代码如下:
public class JxlsTest {
@Test
public void sxssfDynamicColumns() throws Exception {
List<Map<String, Object>> lotsOfStuff = createLotsOfStuff();
Context context = new PoiContext();
context.putVar("lotsOStuff", lotsOfStuff);
context.putVar("columns", new Columns());
try (InputStream in = getClass().getClassLoader().getResourceAsStream("stuff_sxssf_template.xlsx")) {
try (OutputStream os = new FileOutputStream("stuff_sxssf_out.xlsx")) {
Workbook workbook = WorkbookFactory.create(in);
PoiTransformer transformer = PoiTransformer.createSxssfTransformer(workbook, 5, false);
AreaBuilder areaBuilder = new XlsCommentAreaBuilder(transformer);
List<Area> xlsAreaList = areaBuilder.build();
Area xlsArea = xlsAreaList.get(0);
xlsArea.applyAt(new CellRef("Result!A1"), context);
SXSSFWorkbook workbook2 = (SXSSFWorkbook) transformer.getWorkbook();
workbook2.write(os);
}
}
}
private List<Map<String, Object>> createLotsOfStuff() {
Map<String, Object> stuff1 = new LinkedHashMap<>();
Map<String, Object> stuff2 = new LinkedHashMap<>();
stuff1.put("header0", "stuff_1_value0");
stuff1.put("header1_dynamic", "stuff_1_value1");
stuff1.put("header2_dynamic", "stuff_1_value2");
stuff1.put("header3_dynamic", "stuff_1_value3");
stuff2.put("header0", "stuff_2_value0");
stuff2.put("header1_dynamic", "stuff_2_value1");
stuff2.put("header2_dynamic", "stuff_2_value2");
stuff2.put("header3_dynamic", "stuff_2_value3");
return Arrays.asList(stuff1, stuff2);
}
和支持的“Columns”实用程序:
public class Columns {
public Collection<String> keyOf(List<Map<String, Object>> row) {
return row.get(0).keySet().stream().filter(k -> k.endsWith("_dynamic")).collect(Collectors.toList());
}
public Collection<Object> valueOf(Map<String, Object> row) {
return row.entrySet().stream()
.filter(entry -> entry.getKey() != null && entry.getKey().endsWith("_dynamic"))
.map(Entry::getValue)
.collect(Collectors.toList());
}
带有足够 SXSSF 窗口的输出(注意 HEADER 0 出现):
SXSSF 窗口不足的输出(注意 HEADER 0 未出现):
SXXF 窗口不足导致的错误:
18:33:20.653 [main] DEBUG org.jxls.area.XlsArea - Applying XlsArea at Result!A1
18:33:20.693 [main] ERROR org.jxls.area.XlsArea - Failed to transform Template!B1 into Result!B1
java.lang.IllegalArgumentException: Attempting to write a row[0] in the range [0,0] that is already written to disk.
at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:115) ~[poi-ooxml-3.12.jar:3.12]
at org.jxls.transform.poi.PoiTransformer.transform(PoiTransformer.java:112) ~[jxls-poi-1.0.8.jar:na]
at org.jxls.area.XlsArea.transformTopStaticArea(XlsArea.java:232) [jxls-2.2.9.jar:na]
at org.jxls.area.XlsArea.applyAt(XlsArea.java:134) [jxls-2.2.9.jar:na]
更新我发现如果我删除动态 header (请参阅屏幕截图中 B4 单元格中的模板),则不会引发异常并且一切正常。因此,首先评估与行相关的模板,然后 JXLS 返回评估动态 header 模板。有没有办法让 JXLS 先评估 header 模板?
最佳答案
问题在于 Jxls 分两个阶段处理静态单元格。
第一阶段发生在应用命令之前,它只处理顶部命令行之前的单元格。
第二阶段在处理完所有命令后触发,并尝试处理所有剩余的静态单元格。
第二阶段不适用于 SXSSF 工作簿,因为它无法更新位于命令处理期间写入的单元格之前的静态单元格。
现在有 a fix致力于 Jxls master
分支,如果使用流式转换器,它应该通过以不同方式处理静态单元格来解决问题。另见相关 Jxls issue #160 .
修复应该在即将发布的 Jxls 2.7.0 中发布。
关于java - 带 JXLS 2 的 SXSSF 变压器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36241753/
我为 jxls 2.x 创建了一个 Excel 模板。有一个单元格我应用了条件格式。但是,条件格式仅适用于我创建的完全相同的单元格,并且不会复制到以下行。任何的想法? 最佳答案 有一个与此相关的错误,
我可以在 jxls 1.X 中使用 varStatus 属性获取行索引,同时使用 foreach 遍历列表,但是 jxls 2.3.0 不支持这个,如何使用 jxls 2.3.0 在 EXCEL 中输
使用 JXLS 1,可以通过简单调用来在 Excel 模板中进行替换 XLSTransformer.transformXLS(is,beans) 例如,我们有 bean 对象,它们的组织方式如下(不太
我正在使用 jxls-poi-1.0.12。 jxls 2.5 发布后,gradle 自动将 jxls 更新为 2.5。对于结果,我在运行 JxlsHelper.getInstance().proce
我正在创建一个报告,我需要将我的数据结构输出到 Excel 电子表格。为此,我使用 JXLS,但在创建 jx 公式以正确输出数据时遇到问题。 我有一个人员类型列表: List people = ne
我尝试在第一个 jXLS 模板中评估像 ${messages.${column}} 这样的内部变量,但没有成功。 有人可以帮忙吗?这甚至是可能的吗?任何帮助将不胜感激。 干杯乔斯卡 最佳答案 任何对象
我想提供一种通过命令指定工作表名称的方法。工作表名称应根据工作表中的内容动态创建。 我注意到,当使用each-command的multisheet属性时,可以为动态工作表指定固定工作表名称。 在 ve
我只是想证明来自 Java JXLS 的演示代码:http://jxls.sourceforge.net/samples/object_collection.html但是在添加(没有 MAVEN)必要
如果我需要调用从多个线程创建 xls 文件的方法 - 我可以使用 XLSTransformer 作为同步(或者甚至不使用) )类的字段?如果 XLSTransformer.transformXLS()
我正在尝试将两个集合放入 Excel 文档中。我正在这样做: context.putVar("collection1", collection1); context.putVar("collectio
我正在使用 JXLS 创建 Excel 工作表。在模板中,我指定了每列所需的列宽。输出是 HSSFWorkbook。我从 HSSFWorkbook 对象创建一个字节数组,如下所示。问题是,我失去了列宽
我需要在 jxls bean 中使用 DateFormat 对象。如果在我的类里面我写了以下内容: private synchronized DateFormat df = new SimpleDat
我正在使用带有 apache poi 实现的 JXLS 2.3.0。 我使用以下代码来创建 excel : try{ InputStream is = ObjectCollectionDemo.
我使用 JXLS 和 Excel 模板创建了一个报告。我有一堆单元格/列从数据库中提取数据,然后有几列是空白的,然后我的报告中的几列中也有一些公式/条件。我遇到的问题是其中一个公式需要运行/乘以两个空
按照其网站上的示例,http://jxls.sourceforge.net/getting_started.html 。我在尝试写入处理后的文件时遇到了问题。它没有写入应由 JEXL 替换的数据,而是
我想使用一个库来读取 xls 文件,JXLS看起来非常有用,因为可以在 XML 文件中配置映射。 如果我遇到非常大的文件的性能问题,是否可以限制内存中的行数,以便一次读取文件 N 行? 谢谢。 最佳答
我正在使用 JXLS 使用自定义模板生成 Excel 文件。该模板只是库附带的标准网格导出模板,只是我更改了模板文件中某些列的宽度。我的代码大部分只是示例代码的副本。 private void ex
我正在尝试使用 jXLS 将数据从列表导出到 Excel 工作表。我需要使用 jXLS 创建一个 Excel 模板并使用该模板打印出数据列表。我有一个名为 Department 的 Bean 类,我需
使用过的版本 兴趣点:3.15 jxls:2.4.0 jxls-poi:1.0.12 这是一个template允许简单地重现问题。 请注意,我正在使用 JXLS 的多页功能。 当if-conditio
这是我面临的问题:嵌套集合。 我有一个 ArrayList (顶级集合)类。在每个 Subject 中,我都有另一个 Group 类型的 ArrayList。最后,我在每个组中都有一个 学生 的 Ar
我是一名优秀的程序员,十分优秀!