我正在使用 | 转换 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();
}
}
}
您可能可以使用一个小型的 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