Java ApachePOI:按日期对行排序

Java ApachePOI:按日期对行排序,java,excel,sorting,apache-poi,Java,Excel,Sorting,Apache Poi,我正在使用ApachePOI从XML创建Excel文档。我有一个带有日期值的单元格,我将其样式设置为日期: HSSFCellStyle styleDate = workbook.createCellStyle(); HSSFDataFormat dataFormat = workbook.createDataFormat(); styleDate.setDataFormat(dataFormat.getFormat("dd/mm/yyyy Hh:mm")); styleDate.setAlign

我正在使用ApachePOI从XML创建Excel文档。我有一个带有日期值的单元格,我将其样式设置为日期:

HSSFCellStyle styleDate = workbook.createCellStyle();
HSSFDataFormat dataFormat = workbook.createDataFormat();
styleDate.setDataFormat(dataFormat.getFormat("dd/mm/yyyy Hh:mm"));
styleDate.setAlignment(HorizontalAlignment.CENTER);
excel中的数据显示为日期。我需要在Excel文档中按日期按升序排序

我知道POI没有内置的排序功能,我不能使用Aspose单元格,因为我没有得到业务方对额外许可费用的批准

Excel文件结构: 工作表:

哈希映射排序

for (int i = 0; i < nodeList.getLength(); i++) {
    itemHashMap.put(getNodeValue(nodeList, i, "item"),
                                getNodeValue(nodeList, i, "itemDate"));
}
for(int i=0;i
专用无效排序表(表页、int列、int行开始){
布尔排序=真;
int lastRow=sheet.getLastRowNum();
while(排序){
排序=假;
用于(行:页){
如果(row.getRowNum()
不要将日期对象转换为字符串。相反,直接在模型中使用它们。建议格式化不是模型的责任,而是使用TableCellRenderer

允许getValueAt返回日期对象

修改表模型并重写getColumnClass方法,并为hiven列返回相应的类(如Date.class)


默认情况下,该表将为您设置日期对象的格式。

目前,Apache POI不允许使用简单的方法对生成的excel文件中的数据进行排序

您当然可以使用Aspose,但这需要许可证。我要由Apache POI处理并用于最终excel文档的传入数据为XML格式:

<transaction>
    <transactionDate>2015-10-23T00:00:00+03:00</transactionDate>
    <transactionAmount>23</transactionAmount>
    <transactionBatch>000</transactionBatch>
    <transactionBatchDate>2015-10-27T10:12:00+02:00</transactionBatchDate>
    <transactionServiceFee>1</transactionServiceFee>
    <transactionNetAmount>22</transactionNetAmount>
</transaction>
<transaction>
    <transactionDate>2016-02-25T11:13:59+02:00</transactionDate>
    <transactionAmount>-1000</transactionAmount>
    <transactionBatch>000</transactionBatch>
    <transactionBatchDate>2016-02-25T11:14:40+02:00</transactionBatchDate>
    <transactionServiceFee>-30</transactionServiceFee>
    <transactionNetAmount>-970</transactionNetAmount>
</transaction>
    <transaction>
    <transactionDate>2015-10-23T00:00:00+03:00</transactionDate>
    <transactionAmount>23</transactionAmount>
    <transactionBatch>001</transactionBatch>
    <transactionBatchDate>2015-10-27T10:12:00+02:00</transactionBatchDate>
    <transactionServiceFee>1</transactionServiceFee>
    <transactionNetAmount>22</transactionNetAmount>
</transaction>
<transaction>
    <transactionDate>2016-02-25T11:13:59+02:00</transactionDate>
    <transactionAmount>-1000</transactionAmount>
    <transactionBatch>001</transactionBatch>
    <transactionBatchDate>2016-02-25T11:14:40+02:00</transactionBatchDate>
    <transactionServiceFee>-30</transactionServiceFee>
    <transactionNetAmount>-970</transactionNetAmount>
</transaction>
....
为了解决我的问题,我首先必须按日期对XML中的数据进行排序。这是通过使我的模型实现可比较的接口实现的

在我可以按日期对批次进行排序后,如下所示:

Map<String, String> transactionBatchHashMap = new HashMap<>();
for (int i = 0; i < nodeList.getLength(); i++) {
            transactionBatchHashMap.put(getNodeValue(nodeList, i, "transactionBatch"),
                                        getNodeValue(nodeList, i, "transactionBatchDate"));
        }

        transactionBatchHashMap = sortMapByValues(transactionBatchHashMap);
Map transactionBatchHashMap=newHashMap();
for(int i=0;i
然后,通过使用一个简单的foreach循环,我可以将事务分组到每个批下:

for (Map.Entry<String, String> entry : transactionBatchHashMap.entrySet()) {

            HSSFRow batchRow = spreadSheet.createRow(rowNumber);
            ...

            for (int i = 0; i < nodeList.getLength(); i++) {
                String transactionBatchValue = getNodeValue(nodeList, i, "transactionBatch");
                String hashMapBatchKeyValue = entry.getKey();

                if (transactionBatchValue.equals(hashMapBatchKeyValue)) {   
                ...
for(Map.Entry:transactionBatchHashMap.entrySet()){
HSSFRow batchRow=电子表格.createRow(行编号);
...
for(int i=0;i
谢谢!如果我有这种格式的数据怎么办:1.项目日期(使用hashmap键值排序正确排序)1.1.带日期的子项目(未排序)1.2.带日期的子项目(未排序)2.项目日期(排序如上所述)。我不认为在这种情况下它会起作用。。?你可以使用
compareTo
来比较你的对象。你的数据模型不是很清楚。你能举个具体的例子吗?我已经更新了我的初始帖子。我实际上认为我必须创建另一个带有key+value的列表(我需要思考,因为有双键,所以我不能使用set)对于子项排序,由于没有通过POI实现这一点的官方便捷方法。您是否知道shiftRows将在使用-1时隐藏上行,或在使用1时隐藏下行,并且两者都将留下一个空行?您需要创建一个临时行来使用该方法。为什么不在写入数据之前对数据进行排序,并按预期顺序写入行?这就是为什么我可能最终会这样做,因为所有其他变体似乎都失败了。ThanksHow当这个答案涉及Java Swing API时,它能有两张赞成票吗?提问者试图使用Apache POI创建XLS电子表格,而不是呈现JTable。答案完全不相关。
1. transactionBatch 000: transactionBatchDate (sorted by date in asc.)
1.1. transaction: transactionDate (sorted by date grouped by above batch)
1.2. transaction: transactionDate (sorted by date grouped by above batch)
1.3. transaction: transactionDate (sorted by date grouped by above batch)

2. transactionBatch 001: transactionBatchDate (sorted by date in asc.)
2.1. transaction: transactionDate (sorted by date grouped by above batch)
2.2. transaction: transactionDate (sorted by date grouped by above batch)
2.3. transaction: transactionDate (sorted by date grouped by above batch)
Map<String, String> transactionBatchHashMap = new HashMap<>();
for (int i = 0; i < nodeList.getLength(); i++) {
            transactionBatchHashMap.put(getNodeValue(nodeList, i, "transactionBatch"),
                                        getNodeValue(nodeList, i, "transactionBatchDate"));
        }

        transactionBatchHashMap = sortMapByValues(transactionBatchHashMap);
for (Map.Entry<String, String> entry : transactionBatchHashMap.entrySet()) {

            HSSFRow batchRow = spreadSheet.createRow(rowNumber);
            ...

            for (int i = 0; i < nodeList.getLength(); i++) {
                String transactionBatchValue = getNodeValue(nodeList, i, "transactionBatch");
                String hashMapBatchKeyValue = entry.getKey();

                if (transactionBatchValue.equals(hashMapBatchKeyValue)) {   
                ...