Reputation: 101
I am having a problem here while writing some data to an Excel sheet by using Apache POI. I want to call a function several times which will write the data into Excel sheet that I have created.
Is there any way that I can move the pointer to the next row every time at the end of the function???
My code is given below...
public static void excelLog(String filename , String message)
{
String dest="D:\\testexcel.xls";
HSSFWorkbook myWorkBook = new HSSFWorkbook();
HSSFSheet mySheet = myWorkBook.createSheet();
HSSFRow myRow = null;
HSSFCell myCell = null;
String excelData [][] = new String [1][2];
excelData[0][0]=filename;
excelData[0][1]=message;
myRow = mySheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 2 ; cellNum++){
myCell = myRow.createCell((short) cellNum);
myCell.setCellValue(excelData[rowNum][cellNum]);
}
rowNum++;
try{
FileOutputStream out = new FileOutputStream(dest);
myWorkBook.write(out);
out.close();
}catch(Exception e){
e.printStackTrace();
}
}
Please help me in this. Thank you :)
Upvotes: 0
Views: 33866
Reputation: 18569
The problem with your code is in every call for excelLog
method, it's will generate new excel file. I changed your code as below.
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class PoiSample {
private static String dest = "D:\\testexcel.xls";
private static HSSFWorkbook myWorkBook = new HSSFWorkbook();
private static HSSFSheet mySheet = myWorkBook.createSheet();
public static void excelLog(String filename, String message, int rowNum) {
HSSFRow myRow = null;
HSSFCell myCell = null;
String excelData[][] = new String[1][2];
excelData[0][0] = filename;
excelData[0][1] = message;
myRow = mySheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 2; cellNum++) {
myCell = myRow.createCell(cellNum);
myCell.setCellValue(excelData[0][cellNum]);
}
try {
FileOutputStream out = new FileOutputStream(dest);
myWorkBook.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
for (int i = 0; i < 10; i++)
excelLog("filename " + i, "message " + i, i);
}
}
Upvotes: 3
Reputation: 18569
This is modified code so it's support dynamic column size. The idea is to create a row once and reuse it if the row is already exists.
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class PoiSample {
private static String dest = "D:\\testexcel.xls";
private static HSSFWorkbook myWorkBook = new HSSFWorkbook();
private static HSSFSheet mySheet = myWorkBook.createSheet();
private static void excelLog(int row, int col, String value) {
HSSFRow myRow = mySheet.getRow(row);
if (myRow == null)
myRow = mySheet.createRow(row);
HSSFCell myCell = myRow.createCell(col);
myCell.setCellValue(value);
}
public static void main(String[] args) {
int numCol = 10; // assume 10 cols
for (int i = 0; i < 10; i++) {
for (int j = 0; j < numCol; j++) {
excelLog(i, j, "Row : " + i + ", Cell : " + j);
}
}
try {
FileOutputStream out = new FileOutputStream(dest);
myWorkBook.write(out);
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Upvotes: 4