2017-05-16 2 views
1

Verwendung von Apache POI 3,16 Eclipse-IDE Neon 3 Selenium 3.4 (nicht, dass es in diesem Fall zählt)Apache POI setCellData nicht tatsächlich Einstellung Zellendaten

ich ein Problem mit dem Schreiben von Werten in eine Excel-Tabelle mit dann den Wert zurücklesen.

Hier ist, was ich auf einem hohen Niveau zu tun:

  1. eine Excel-Aufmachen
  2. Datei schreiben Zeile 1 Spalte 1 (wir Index verwenden, beginnend bei 0)
  3. Lesen zurück, was wurde in dieser Zelle geschrieben.

Die Zelle enthält den Wert "B2". In einer setCellData() - Funktion schreibe ich in die Zelle ein "Hallo Welt" und die Funktion den Inhalt der Zelle zurückgeben. Ich habe auch eine separate Funktion, die den Inhalt einer bestimmten Zelle einliest.

Wenn ich den folgenden Code:

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 

import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class Udemy_Excel_Driven { 

    public static XSSFWorkbook wb; 
    public static XSSFSheet sheet; 
    public static XSSFRow row; 
    public static XSSFCell cell; 
    public static FileInputStream fis; 

    public static void main(String[] args) throws IOException, Exception 
    { 

     System.out.println("Before cell edit value is:"); 

     System.out.println(getCellData(1,1)); 



     String value = setCellData(1,1,"Hello World"); 

     System.out.println("What's the value after setting it with setCellData()?");     
     System.out.println(value); 
     System.out.println("What's the value using getCellData()?"); 
     System.out.println(getCellData(1,1)); 
    } 

    public static String getCellData(int rowNum, int colNum) throws IOException 
    { 

     /* 
     * Hierarchy of excel data: 
     * 
     * Workbook - take control of this 
     * Sheet - pick up the sheet of the workbook 
     * Row - pick the row 
     * Column - after picking the row, select the column 
     * Value - grab the value from the cell 
     * 
     */ 


     //0. = identify the path to the excel file in the system. 
     fis = new FileInputStream("C:\\data.xlsx"); 

     //1. Create a new XSSFWorkbook object. You need to pass in a FileInputStream object into it, which you created earlier. 
     wb = new XSSFWorkbook(fis); 

     //2. Get the sheet in the workbook. Create a new XSSFsheet object and set it to the sheet in the workbook 
     // Access the workbook method "getSheet" and pass in the name of the sheet 
     sheet = wb.getSheet("script"); 

     //3. Get the row and column. We are going to access the data from row 2 column 2. And remember the indices start at 0. 
     row = sheet.getRow(rowNum); 
     cell = row.getCell(colNum); 
     //get the value specified in the row and cell 
     return cell.getStringCellValue(); 
    } 



    public static String setCellData(int rowNum, int colNum, String data) throws IOException 
    { 

     fis = new FileInputStream("C:\\data.xlsx"); 
     wb = new XSSFWorkbook(fis); 
     sheet = wb.getSheet("script"); 
     row = sheet.getRow(rowNum); 
     cell = row.getCell(colNum); 

      cell.setCellValue(data); 
      String cellData = cell.getStringCellValue(); 
     return cellData; 

    } 

ich folgende Ausgabe:

Before cell edit value is: 
B2 
What's the value after setting it with setCellData()? 
Hello World 
What's the value using getCellData()? 
B2 

Here's the contents of the data.xlsx file:

Ich glaube nicht das Schreib tatsächlich eingetreten ist, da ich das eröffnet Excel-Datei und die Zeichenfolge "Hello World" befand sich nicht in der angegebenen Zelle. Irgendwelche Antworten auf dieses Problem?

+0

hat "Hallo Welt" in Excel geschrieben? Oder bekommst du nur Probleme beim Zurücklesen? –

+1

Also, was 'wb = neues XSSFWorkbook (fis);' tut? Es erzeugt ein neues 'XSSFWorkbook' in' RAM' aus Daten der 'fis'. Also erzeugt Ihre 'getCellData' ein neues' XSSFWorkbook' in 'RAM' aus Daten der' fis' aus Datei 'C: \ data.xlsx' und erhält dann Daten aus diesem' XSSFWorkbook'. Und Ihre 'setCellData' erstellt auch ein' XSSFWorkbook' in 'RAM' aus Daten der' fis' aus der Datei 'C: \ data.xlsx' und setzt dann Daten in dieses' XSSFWorkbook' in 'RAM'. Aber nirgends werden Daten in die Datei 'C: \\ data.xlsx' geschrieben. –

+0

Jetzt erkannte ich das Problem. Die Objekte werden erstellt und bearbeitet, und es gab nie Code, um tatsächlich in die Datei zu schreiben. Ich fügte Code in der setCellData-Funktion hinzu, um eine neue FileOutputStream-Funktion zu erstellen, und schrieb in die Datei zurück. Jetzt, wenn ich die Datei lese, hat sie "Hello World" in der spezifischen Zelle geschrieben. – user8022038

Antwort

1

Ich sehe keinen Teil Ihres Codes, der tatsächlich in Ihre Datei schreibt. Es sollte mehr oder weniger in etwa so aussehen:

FileOutputStream fileOut = new FileOutputStream("C:\\data.xlsx"); 
wb.write(fileOut); 
fileOut.close(); 

Sie können auch diese guide für dieses Problem beraten sowie andere Funktionen, die Sie bei der Umsetzung interessiert sein könnten.

+0

Dies war das fehlende Teil des Puzzles (zusammen mit der Erklärung, dass ich die Informationen des Arbeitsobjekts manipulierte und nicht in die Datei selbst schrieb). Vielen Dank! – user8022038