- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
过去几个月我一直在使用 Apache POI 来为我们的应用程序创建“导出到 Excel 或从 Excel 导入” 功能。
Note: I used 3.9 but have no switched to 3.10-FINAL.
典型的用例是,用户下载空模板或将现有数据导出到 Excel 文件。然后,他更改数据并再次上传文件。
为了向用户提供详细的反馈,我们使用他上传的 Excel 文件并从中创建一个报告文件。该报告文件是上传文件的副本,其中包含两个附加列,其中包含有关他导入的数据的信息。例如,一条错误消息告诉他为什么他的数据不被接受。
这需要将所有列向右移动并向左侧添加两个新列。我实现了这个,我什至设法将单元格注释与列一起移动。但是现在我陷入困境,因为我无法移动列分组。
该模板有几列组合在一起并默认折叠。因为我们有 100 多列,所以应该通过隐藏一些很少使用的列来让用户更容易。
在模板创建期间,我使用以下代码来创建分组。
SimpleEntry<Integer, Integer> group;
sheet.setRowSumsRight(false);
for (String groupId : groupMap.keySet()) {
group = groupMap.get(groupId);
sheet.groupColumn((group.getKey() + 1) + offset, group.getValue() + offset);
sheet.setColumnGroupCollapsed(group.getValue() + offset, true);
}
group.getKey()
返回组的最左边的列,group.getValue()
返回组的最右边的列。 偏移量
始终为0。
我的想法是使用 offset
为 2 的相同代码来移动报告文件中的分组。认为简单地覆盖是行不通的,我尝试先用以下方法取消分组列:
sheet.ungroupColumn(0, 130);
这只是一个例子。我尝试了几种不同的方法,例如使用最大范围一次性取消所有组的分组,或者取消 map 上每个组的分组。
然而,一切都没有按预期进行。如果我尝试取消列分组,它会破坏分组并产生不良效果。列组被分成更小的组,而不是从 Excel 文档中删除。有些实际上已被删除,但我现在找到了让它安全工作的方法。
Note: I'm using XSSF only.
我没有主意了,在我看来,由于某种原因不可能使用标准的 POI API 重写列分组。POI API。事实上,列分组功能似乎只能在填充数据之前对空文档正常工作。
我花了很多时间在谷歌上搜索这个问题,但没有找到解决方案,坦率地说,几乎没有任何结果与我的问题相匹配。要么我的google-fu离开了我,要么我是唯一一个需要为这样的功能费心的人。
我希望这里有人可能对我的问题有想法或解决方案,因为我认为这应该是可能的。否则 ungroupColumn
函数还有什么意义呢?
<小时/>Note: I thought about using two different templates and simply copying the data since it seems to be no problem to create the groupings correctly when generating the template.
This would require several major changes to the code however (and I'm basically out of time) and would pose problems with one or two other requirements I have to fulfill. So this is more like a Plan C for me, which would be my last solution to the problem.
编辑:
对于那些感兴趣的人,我采用了 Florian Rodler 提出的解决方案,因为事实证明它是解决我的问题的可行解决方案/解决方法。我为此稍微修改了他的代码。
if (sheet.getPhysicalNumberOfRows() > 0) {
Row row = sheet.rowIterator().next();
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
sheet.ungroupColumn(i, i);
}
}
这成功地从我的 Excel 文档中删除了所有列组/大纲。然后,我使用问题中显示的模板创建代码(offset
大于 2)来移动(或者更确切地说重新创建)右侧的组。
最佳答案
似乎 Apache POI 处理列组的方式被破坏并产生副作用,但我认为有一种方法可以删除工作表中的所有列组,如下所示:
for (int i=first_column; i<=last_column; i++) {
sheet.ungroupColumn(i,i);
}
如果只有大纲级别,这将删除所有组。如果有 n 个大纲级别,您可能需要重复 n 次以确保每个组都被删除。
关于java - 是否可以使用 POI 更改现有 Excel 中的列分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25261724/
您好,我正在处理 BIRT 报告。我有一个查询,我必须对父级的重复数据进行分组,但子级也不能分组! 在我的查询中: item 是父项,item_ledger_entry 是子项。我有来自 item.N
我正在使用 GA API。 这是针对 MCF 目标报告(底部)的标准目标完成指标表(顶部) 看一下这个: 总数加起来 (12,238),但看看按 channel 分组的分割有多么不同!我以为这些会很接
我正在开发一个流量计数器,我想获得 IP 和重复计数,但是如何? 就像是 :select ip, count(ip) from Redirect 返回 : null total ip count 重定
我尝试编写一个正则表达式来匹配条件表达式,例如: a!=2 1+2=2+a 我尝试提取运算符。我当前的正则表达式是“.+([!=<>]+).+” 但问题是匹配器总是尝试匹配组中可能的最短字符串
在 MS Transact SQL 中,假设我有一个这样的表(订单): Order Date Order Total Customer # 09/30/2008 8
我想按 m.ID 分组,并对每个 m.id 求和 (pm.amount_construction* prod.anzahl) 实际上我有以下结果: Meterial_id | amount_const
我想根据多列中的值对值进行分组。这是一个例子: 我想得到输出: {{-30,-50,20},{-20,30,60},{-30,NULL or other value, 20}} 我设法到达: SELE
我正在尝试找出运行此查询的最佳方式。我基本上需要返回在我们的系统中只下了一个订单的客户的“登录”字段列表(登录字段基本上是客户 ID/ key )。 我们系统的一些背景...... 客户在同一日期下的
给定以下mysql结果集: id code name importance '1234', 'ID-CS-B', 'Chocolate Sauce'
大家好,我的数据框中有以下列: LC_REF 1 DT 16 2C 2 DT 16 2C 3 DT 16 2C 1 DT 16 3C 6 DT 16 3C 3
我有这样的 mongoDB 集合 { "_id" : "EkKTRrpH4FY9AuRLj", "stage" : 10, }, { "_id" : "EkKTRrpH4FY9
假设我有一组数据对,其中 index 0 是值,index 1 是类型: input = [ ('11013331', 'KAT'), ('9085267',
java中用stream进行去重,排序,分组 一、distinct 1. 八大基本数据类型 List collect = ListUtil.of(1, 2, 3, 1, 2).stream().fil
基本上,我从 TABLE_A 中的这个开始 France - 100 France - 200 France - 300 Mexico - 50 Mexico - 50 Mexico - 56 Pol
我希望这个正则表达式 ([A-Z]+)$ 将选择此示例中的最后一次出现: AB.012.00.022ABC-1 AB.013.00.022AB-1 AB.014.00.022ABAB-1 但我没有匹配
我创建了一个数据透视表,但数据没有组合在一起。 任何人都可以帮助我获得所需的格式吗? 我为获取数据透视表而编写的查询: DECLARE @cols AS NVARCHAR(MAX), -- f
我想按时间段(月,周,日,小时,...)选择计数和分组。例如,我想选择行数并将它们按 24 小时分组。 我的表创建如下。日期是时间戳。 CREATE TABLE MSG ( MSG_ID dec
在 SQL Server 2005 中,我有一个包含如下数据的表: WTN------------Date 555-111-1212 2009-01-01 555-111-1212 2009-
题 假设我有 k 个标量列,如果它们沿着每列彼此在一定距离内,我想对它们进行分组。 假设简单 k 是 2 并且它们是我唯一的列。 pd.DataFrame(list(zip(sorted(choice
问题 在以下数据框中 df : import random import pandas as pd random.seed(999) sz = 50 qty = {'one': 1, 'two': 2
我是一名优秀的程序员,十分优秀!