Writing to existing excel file using POI - java

I have used POI to read from / write to excel sheets.When writing to a new sheet using POI,it worked.But, when i am trying to write in a existing excel workbook using POI, it doesnt worked.how can i correct this issue?
workBook = getWorkbookSheet(workBookName);
sheet1 = workBook.getSheetAt(1);
sheet2 = workBook.getSheetAt(2);
while(sheetStart<sheet1.getLastRowNum() + 1)
{
HSSFRow rowSheet1 = sheet1.getRow(sheetStart);
HSSFCell cellSheet1 = rowSheet1.getCell(4);
if(cellSheet1.getStringCellValue().trim().equals(valY))
{ cellSheet1.setCellValue("N");
}
else
//do nothing
sheetStart++;
}
fileOutSheet1 = new FileOutputStream(sheet1.getSheetName());
workBook.write(fileOutSheet1);
fileOutSheet1.flush();
fileOutSheet1.close();

fileOutSheet1 = new FileOutputStream(sheet1.getSheetName()); seems not correct. you should give the path of workbook instead of sheet1.getSheetName. because you are writing the whole workbook even after a single cell content change.
for example it should be like
FileOutputStream fileOut = new FileOutputStream("C:\\MyWorkbook.xlsx");
wb.write(fileOut);
fileOut.close();
for detail visit here

Related

Why does Apache POI destroy the format of my Excel file?

I'm writing a program which should put some date into an Excel sheet (.xls). The Excel sheet is a given template which I have to use.
My problem now is that when I change a cell value with the code below the format of the sheet is completely lost. The backround colour, buttons, pictures, ... are gone and also the size of the cells is changed.
I have tried to use createCell() instead of getCell() but this didn't help.
public static void write() throws IOException {
File file = new File(...);
FileInputStream fis = new FileInputStream(file);
HSSFWorkbook workbook = new HSSFWorkbook(fis);
HSSFSheet sheet = workbook.getSheetAt(1);
HSSFCell cell = null;
cell=sheet.getRow(4).getCell(2);
cell.setCellValue(55);
fis.close();
FileOutputStream outFile = new FileOutputStream(file);
workbook.write(outFile);
workbook.close();
outFile.close();
}
I hope someone can give me a hint what I am doing wrong here.

After updating existing cell value in .xlsx file using POI, the file is giving HTTP 403 if used by an API

I have an excel file which contains many columns and one set of data row in it.
After changing the value of the asOf field, as I am using it in API which is taking excel file, gives 403 Forbidden error. I have checked the following things:
The field is updated correctly. (I checked the formatting and cell style of excel after updating it manually.)
If I change the cell value manually then API is giving 200.
Image For Failure Response: When asOf field updated by Java Code
Image For Pass Response: When asOf field updated manually.
The image of field which I am updating is below:
Below is the java code that I am using:
public static void excelFileReadAndUpdate() throws IOException {
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("./src/test/resources/testdata/HoldingDataWeekendDate.xlsx"));
FileOutputStream fileOut = new FileOutputStream("./src/test/resources/testdata/HoldingDataWeekendDate.xlsx");
XSSFSheet sheet1 = wb.getSheetAt(0);
XSSFRow row = sheet1.getRow(1);
XSSFCell cell = row.getCell(0);
cell.setCellValue("2018-10-31");
wb.write(fileOut);
fileOut.close();
}
Note: I tried other approaches also like using the workbook and preserve the formatting but it is not working. If I update the field manually after opening the excel then it works.
Any suggestion/advice would be great help.
Thanks in advance.
After searching and applying many approaches, finally, it has been resolved by applying some code giving read/write permission to that folder/file in java.
public static void excelFileReadAndUpdate() throws IOException {
final File file = new File("location of your excel file directory");
file.setReadable(true, false);
file.setExecutable(true, false);
file.setWritable(true, false);
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("./src/test/resources/testdata/HoldingDataWeekendDate.xlsx"));
FileOutputStream fileOut = new FileOutputStream("./src/test/resources/testdata/HoldingDataWeekendDate.xlsx");
XSSFSheet sheet1 = wb.getSheetAt(0);
XSSFRow row = sheet1.getRow(1);
XSSFCell cell = row.getCell(0);
cell.setCellValue("2018-10-31");
wb.write(fileOut);
fileOut.close();
}

Apache POI: Export Data to Another Workbook

I want to export all the data from one workbook to another using Java. I used FOR LOOP to read all the data from the input.xls file. Then I want to Export all the read data to output.xls. I don't know how to export it after reading data. I need your help guys. Thanks.
HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream("C:\\input.xls"));
FileOutputStream wbML = new FileOutputStream("C:\\output.xls");
Sheet sheet1 = wb.getSheetAt(0);
for (Row row : sheet1) {
for (Cell cell : row) {
String sValue = cell.getRichStringCellValue().getString();
System.out.println(sValue);
}
}
If you just want to copy the workbook, there is no need to iterate. Just write it to a new file.
Workbook wb = new HSSFWorkbook(new FileInputStream("C:\\input.xls"));
FileOutputStream fileOut = new FileOutputStream("C:\\ouput.xls");
wb.write(fileOut);
fileOut.close();

Null pointer exception while using Apache POI

I am trying to write a excel file using Apache POI package. Here is the code snippet:
String basePath = "/home/aman/Desktop";
String fileName = "result.xls";
File file = new File(basePath, fileName); //File not null. checked.
OPCPackage pkg = OPCPackage.openOrCreate(file); //pkg not null. checked.
Workbook wb = new XSSFWorkbook(pkg); //GenerateReport.java:63
I get the following error:
Exception in thread "main" java.lang.NullPointerException
at org.apache.poi.POIXMLDocumentPart.read(POIXMLDocumentPart.java:382)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:155)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186)
at amazon.category.database.GenerateReport.generateExcel(GenerateReport.java:63)
at amazon.category.database.MerchantAdoptionStats.processAdoptionStats(MerchantAdoptionStats.java:197)
at amazon.category.database.MerchantAdoptionStats.main(MerchantAdoptionStats.java:386)
Any help appreciated.
I found this example at the tutorial site:
here
You could try this approach.
Workbook wb = new HSSFWorkbook();
//Workbook wb = new XSSFWorkbook();
CreationHelper createHelper = wb.getCreationHelper();
Sheet sheet = wb.createSheet("new sheet");
// Create a row and put some cells in it. Rows are 0 based.
Row row = sheet.createRow((short)0);
// Create a cell and put a value in it.
Cell cell = row.createCell(0);
cell.setCellValue(1);
// Or do it on one line.
row.createCell(1).setCellValue(1.2);
row.createCell(2).setCellValue(createHelper.createRichTextString("This is a string"));
row.createCell(3).setCellValue(true);
// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();
I hit my head against this one for a while myself. The trick is whether or not the file exists prior.
//if file is .xls
Workbook workbook;
if(file.exists) {
NPOIFSFileSystem fs = new NPOIFSFileSystem(file);
workbook = new HSSFWorkbook(fs.getRoot(), false);
}
else {
workbook = new HSSFWorkbook();
}
//if file is .xlsx
Workbook workbook;
if(file.exists) {
OPCPackage pkg = OPCPackage.open(file);
workbook = new XSSFWorkbook(pkg);
}
else {
workbook = new XSSFWorkbook();
}
The trick appears to be (and this doesn't look like it is documented well), that you create the workbooks off of the file system or package objects only if the file exists prior. If you want a new file, then don't use the file system or package objects to create your workbooks.
If everything is what it looks like, you should not be able to build an XSSFWorkbook on an .xls file, since it is a class to model .xlsx files. You should use WorkbookFactory.create() instead of that, which is a factory method that will return the appropiate Workbook implementation for each case

Open EXISTING xls in Apache POI

I have an existing file (C:\wb.xls) that I want to open and make changes to. How in Apachie POI do you open an existing file? All the documentation that I find has to go with creating a new file. And if you know, how do you insert a new row at the top of the xls file or how to autoformat column widths?
Use one among the following
XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(xlFileAddress));
OR
Workbook wb = WorkbookFactory.create(new File(xlFileAddress));
OR
Workbook wb = WorkbookFactory.create(new FileInputStream(xlFileAddress));
and then use wb for creating/reading/updating sheets/rows/cell whatever you want. For detail visit here. This will definitely help you.
Did you try reading the Apache POI HowTo "Reading or modifying an existing file"? That should cover you...
Basically, what you'll want to do is taken from the QuickGuide eg this for loading a File
Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));
Sheet s = wb.getSheetAt(0);
// Get the 11th row, creating if not there
Row r1 = s.getRow(10);
if (r1 == null) r1 = s.createRow(10);
// Get the 3rd column, creating if not there
Cell c2 = r1.getCell(2, Row.CREATE_NULL_AS_BLANK);
// Set a string to be the value
c2.setCellValue("Hello, I'm the cell C10!");
// Save
FileOutputStream out = new FileOutputStream("New.xls");
wb.write(out);
out.close();

Categories

Resources