当在 csv 到 excel 转换 jar 中发现中断级别时,Java 在 csv 中插入换行符或在 excel 中插入空行

问题描述 投票:0回答:1

我正在使用 | 转换 csv 文件第一列为 Level 的 Excel 分隔符。某些行的级别具有连续值,并且在它们之间不连续。我想在未找到连续级别时在 csv 文件中插入新的空行,以便类似地它将转换为带有空行的 Excel。但由于我还在学习使用 POI API,似乎很难比较 csv 文件中的列。

相反,我将所有数据写入 Excel 并尝试在 Excel 中插入空白行。但 XSSFWorkbook shiftrows 方法似乎没有按照 POI 文档(POI 4.0.1)实现,因此无法在 Excel 中插入行。以下是我的代码和示例 csv 文件:

OPRT ID|4026420

OPRT 修订|B

级别|零件类型|Pl|对象 ID|修订版|名称|创作|状态|日期

1|部分修订|0066|4100748-0066|A|PCBA1||||||2023 年 8 月 30 日 05:28||2023 年 8 月 30 日

2|部分修订|0066|4100747-0066|A|PCBA2||||||2023 年 8 月 30 日 05:28||2023 年 9 月 1 日

1|部分修订|0001|4100748-0001|B|PCBA1||||||2023年9月20日08:46||2023年9月20日08:46

1|部分修订|0066|4100747-0066|A|PCBA3||||||2023年8月30日05:28||2023年9月01日10:08

1|部分修订|8628|4100747-8628|A|PCBA4||||||2023年9月1日10:21||2023年9月1日10:22

1|部分修订|0725|4100747-0725|A|PCBA5 新||||||2023 年 8 月 31 日 07:03||2023 年 10 月 4 日 11:54

1|部分修订|8628|4100748-8628|A|PCBA1||||||2023年9月1日09:49||2023年9月1日09:49

2|部分修订|8628|4100747-8628|A|PCBA6||||||2023年9月1日10:21||2023年9月1日10:22

1|部分修订|0002|4100748-0002|A|PCBA1||||||2023年9月1日08:04||2023年9月1日08:04

1|部分修订|0260|4100748-0260|A|PCBA1||||||2023年9月1日09:45||2023年9月1日09:45

1|零件装配修订||4100748|B|PCBA1||||||2023年9月20日08:40||2023年9月20日08:43

2|部分修订||4100747|A|PCBA7 新||||||2023 年 8 月 21 日 08:58||2023 年 10 月 4 日 04:56

2|部分修订|0001|4100747-0001|A|PCBA8||(PR) 生产||||2023 年 8 月 25 日 12:49

任何关于如何解决在 excel 中插入空行或在 csv 中插入行(如果高效的话)的建议都会非常有帮助。

谢谢

public class CSV2Excel {
    public static void main(String[] args) {
        if (args.length < 4) {
          System.out.println("Please provide correct arguments");
          return;
        } 
        String timeStamp = (new SimpleDateFormat("yyyyMMddHHmmss")).format(new Date());
        String csvFilePath = args[0];
        String csvFileName = args[1];
        String excelFilePath = args[2];
        String exelFilaName = args[3];
        String delim = "\\|";
        String csvFile = String.valueOf(csvFilePath) + "//" + csvFileName;
        String excelFile = String.valueOf(excelFilePath) + "//" + exelFilaName + "_" + ".xlsx";
        try {
          SXSSFWorkbook sXSSFWorkbook = new SXSSFWorkbook();
          Sheet sheet = sXSSFWorkbook.createSheet("Sheet1");
          int rowNumber = 0;
          BufferedReader reader = new BufferedReader(new FileReader(csvFile));
          System.out.println("Reading Started \n");
          String line;
          while ((line = reader.readLine()) != null) {
            String[] data = line.split(delim);
            Row row = sheet.createRow(rowNumber++);
            for (int i = 0; i < data.length; i++) {
              Cell cell = row.createCell(i);
              cell.setCellValue(data[i]);
            } 
          } 
          
// as there are some header lines till row 5 comparing with 6th row
          while(rowNumber>6)
          {
              System.out.println("inside while..");
              System.out.println("1. Total Numbers of lines Read :" + rowNumber);
              
              Row lastRow = sheet.getRow(rowNumber-1);
              Row prevRow = sheet.getRow(rowNumber-2);
              
              System.out.println("got laseRow and prevrow..");
              
              Cell iLastRowLevel = lastRow.getCell(0);
              Cell iPrevRowLevel = prevRow.getCell(0);
              
              System.out.println("got 2 string levels..:" + iLastRowLevel + "," + iPrevRowLevel);

              
              //int iLastRowLevel = Integer.parseInt(lastRow.getCell(0).getNumericCellValue());
              //int iPrevRowLevel = String.valueOf(prevRow.getCell(0).getNumericCellValue());
              
             
              //iLastRowLevel.setCellType(CellType.NUMERIC);
              //iPrevRowLevel.setCellType(CellType.NUMERIC);
              DataFormatter formatter = new DataFormatter();
             formatter.formatCellValue(iLastRowLevel);
             formatter.formatCellValue(iPrevRowLevel);
              System.out.println("got 2 int levels..:" + formatter.formatCellValue(iLastRowLevel) + "," + formatter.formatCellValue(iPrevRowLevel));
              
              double diff = Integer.parseInt(iLastRowLevel.getStringCellValue()) - Integer.parseInt(iPrevRowLevel.getStringCellValue());
             
              System.out.println("got diff..:" + diff);
              
// inserting line if level is discontinued, do not insert line when level value in consecutive rows is //same
              if(diff<0  || diff>1)
              {
                  System.out.println("need to insert a blank line \n");
                  //sheet.shiftRows(rowNumber,sheet.getLastRowNum()+1,1,true,true);
                  
                  int rows=sheet.getLastRowNum();
                  System.out.println("got last row..:" + rows);
                  System.out.println("Rownumber current ..:" + rowNumber);
                  sheet.shiftRows(rowNumber,rows,1,true,false);
                  Row newRow = sheet.createRow(rowNumber);
                  
              }
              else
              {
                  System.out.println("difference is 0 or 1 continue \n");
                  rowNumber=rowNumber-1;
                  continue;
                  
              }
              
              rowNumber=rowNumber-1;
             
          }
          System.out.println("Total Numbers of lines Read :" + rowNumber + '\001');
          reader.close();
          System.out.println("Reading Complete \n");
          System.out.println("File writing Started \n");
          FileOutputStream outputStream = new FileOutputStream(excelFile);
          sXSSFWorkbook.write(outputStream);
          sXSSFWorkbook.close();
          outputStream.close();
          System.out.println("File writing Completed \n");
        } catch (Exception e) {
          e.printStackTrace();
        } 
      }
}
java excel csv apache-poi converters
1个回答
0
投票

您可能可以使用一个小型的 powequery 来执行此操作,如下所示

你的原始数据很奇怪。列标题指示从“级别”到“日期”有 9 列,但后续行有 14 列。这个问题在这里被忽略了

let  Source = Csv.Document(File.Contents("C:\Temp\a.csv"),[Delimiter="|", Encoding=1252, QuoteStyle=QuoteStyle.None]),
#"Added Index" = Table.AddIndexColumn(Source, "Index", 0, 1, Int64.Type),
#"Added Custom" = Table.AddColumn(#"Added Index", "test", each try if Number.From(#"Added Index"{[Index]+1}[Column1])=1 and Number.From([Column1])>1 then Number.From([Index])+.1 else null otherwise null),
spacers = Table.ExpandListColumn(#table({"Index"},{{List.RemoveNulls(#"Added Custom"[test])}}), "Index"),
combined = Table.Sort(#"Added Index" & spacers,{{"Index", Order.Ascending}})
in  combined

© www.soinside.com 2019 - 2024. All rights reserved.