Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HSSF createrow每次仅创建一行_Java_Excel_Apache Poi_Hssf - Fatal编程技术网

Java HSSF createrow每次仅创建一行

Java HSSF createrow每次仅创建一行,java,excel,apache-poi,hssf,Java,Excel,Apache Poi,Hssf,我试图创建一个包含多个工作表的工作簿,但每个excel工作表中始终只有一行,这是源文件中的最后一行。 我的代码如下所示: public void parse() { BufferedReader reader = null; BufferedWriter writer = null; String tmpFile = "tmpFile.tmp"; ExcelFile excelFile = new ExcelFile(_fileName + ".xlsx");

我试图创建一个包含多个工作表的工作簿,但每个excel工作表中始终只有一行,这是源文件中的最后一行。 我的代码如下所示:

public void  parse()
{
    BufferedReader reader = null;
    BufferedWriter writer = null;
    String tmpFile = "tmpFile.tmp";
    ExcelFile excelFile = new ExcelFile(_fileName + ".xlsx");
    int lineCount = 0;
    try 
    {
        reader = new BufferedReader(new FileReader(_fileName));
        writer = new BufferedWriter(new FileWriter(tmpFile));
        String line = null;         
        while ( (line = reader.readLine()) != null)
        {
            String newLine = processLine(line.trim());
            if (newLine == null)
                continue;
            else
            {                   
                if (newLine.isEmpty() )
                {
                    lineCount++;
                    if(lineCount > 1)
                    {
                        continue;
                    }
                }
                else if (!newLine.isEmpty())
                {
                    lineCount = 0;
                }
                if (getRepositoryName(newLine) != null && !getRepositoryName(newLine).isEmpty() )
                    excelFile.writeLine(getRepositoryName(newLine), newLine);
            }

        }
        reader.close();
        excelFile.createFile(_fileName.split("\\.")[0]);            
    }
        catch (IOException e) {
            e.printStackTrace();
        }
}
   public void writeLine(String sheetName, String line)
{
    HSSFSheet sheet = getSheet2(sheetName);     
    HSSFSheet sheetMain = getSheet2(_mainSheetName);
    HSSFRow row = sheet.createRow(sheet.getLastRowNum() == 0 ? 0 :sheet.getLastRowNum()+1);
    HSSFRow rowMain = sheetMain.createRow(sheetMain.getLastRowNum() == 0 ? 0 :sheetMain.getLastRowNum()+1);
    String[] columnsArr = line.split(",");
    for (int i = 0; i < columnsArr.length ; i++)
    {
        HSSFCell cell = row.createCell(i);
        HSSFCell cellMain = rowMain.createCell(i);
        cell.setCellValue(columnsArr[i]);
        cellMain.setCellValue(columnsArr[i]);
    }

}
每行的创建由以下人员完成: excelFile.writeLine(getRepositoryName(换行符),换行符); 从以前的方法

ExcelFile类中的writeLine实现如下:

public void  parse()
{
    BufferedReader reader = null;
    BufferedWriter writer = null;
    String tmpFile = "tmpFile.tmp";
    ExcelFile excelFile = new ExcelFile(_fileName + ".xlsx");
    int lineCount = 0;
    try 
    {
        reader = new BufferedReader(new FileReader(_fileName));
        writer = new BufferedWriter(new FileWriter(tmpFile));
        String line = null;         
        while ( (line = reader.readLine()) != null)
        {
            String newLine = processLine(line.trim());
            if (newLine == null)
                continue;
            else
            {                   
                if (newLine.isEmpty() )
                {
                    lineCount++;
                    if(lineCount > 1)
                    {
                        continue;
                    }
                }
                else if (!newLine.isEmpty())
                {
                    lineCount = 0;
                }
                if (getRepositoryName(newLine) != null && !getRepositoryName(newLine).isEmpty() )
                    excelFile.writeLine(getRepositoryName(newLine), newLine);
            }

        }
        reader.close();
        excelFile.createFile(_fileName.split("\\.")[0]);            
    }
        catch (IOException e) {
            e.printStackTrace();
        }
}
   public void writeLine(String sheetName, String line)
{
    HSSFSheet sheet = getSheet2(sheetName);     
    HSSFSheet sheetMain = getSheet2(_mainSheetName);
    HSSFRow row = sheet.createRow(sheet.getLastRowNum() == 0 ? 0 :sheet.getLastRowNum()+1);
    HSSFRow rowMain = sheetMain.createRow(sheetMain.getLastRowNum() == 0 ? 0 :sheetMain.getLastRowNum()+1);
    String[] columnsArr = line.split(",");
    for (int i = 0; i < columnsArr.length ; i++)
    {
        HSSFCell cell = row.createCell(i);
        HSSFCell cellMain = rowMain.createCell(i);
        cell.setCellValue(columnsArr[i]);
        cellMain.setCellValue(columnsArr[i]);
    }

}
public void writeLine(字符串sheetName,字符串行)
{
HSSFSheet sheet=getSheet2(sheetName);
HSSFSheet sheetMain=getSheet2(_mainSheetName);
HSSFRow row=sheet.createRow(sheet.getLastRowNum()==0?0:sheet.getLastRowNum()+1);
HSSFRow rowMain=sheetMain.createRow(sheetMain.getLastRowNum()==0?0:sheetMain.getLastRowNum()+1);
String[]columnsArr=line.split(“,”);
对于(int i=0;i
需要知道我做错了什么,以及在不在循环中运行时是否可能创建多行

提前谢谢

问题在于:

HSSFRow row = sheet.createRow(sheet.getLastRowNum() == 0 ? 0 :sheet.getLastRowNum()+1);
HSSFRow rowMain = sheetMain.createRow(sheetMain.getLastRowNum() == 0 ? 0 :sheetMain.getLastRowNum()+1);
第一次方法
sheet.getLastRowNum()
返回
0
,因此
sheet.createRow
作为参数提供
0
。但下一次结果相同,您再次创建行
0
(在循环的每个迭代中都是相同的)

从getLastRowNum()的

由于excel文件格式的特殊性,如果调用此方法的结果为零,则无法判断这是否意味着工作表上有零行,或者在零位置有一行。对于这种情况,另外调用getPhysicalNumberOfRows()来判断位置0处是否有行

因此,类似这样的方法应该有效:

HSSFRow row = sheet.createRow(sheet.getPhysicalNumberOfRows() == 0 ? 0 :sheet.getLastRowNum()+1);
HSSFRow rowMain = sheetMain.createRow(sheetMain.getPhysicalNumberOfRows() == 0 ? 0 :sheetMain.getLastRowNum()+1);

谢谢你的回答!我能够看到并理解这就是发生的情况,但仍然无法理解为什么每次都不递增,以及我应该做些什么来解决这个问题。我认为您可以使用
getPhysicalNumberOfRows()
方法。我已经更新了我的answear以显示该解决方案。