This question already has answers here:
get number of columns of a particular row in given excel using Java
(3 answers)
Closed 8 years ago.
In my java application I am trying to convert excel to pdf using apache-poi.In my excel file,the number of columns are different in some rows.First and second rows contain one column,remaining rows contains 8 columns.Here is my code
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
int cellNumber = 0;
if (flag) {
table = new PdfPTable(row.getLastCellNum());
flag = false;
}
// For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
if (temp == 0) {
numberOfColumns = row.getLastCellNum();
PdfPCell c1 = new PdfPCell(new Phrase(
cell.getStringCellValue()));
c1.setHorizontalAlignment(Element.ALIGN_CENTER);
table.addCell(c1);
table.setHeaderRows(1);
}else{
cellNumber =checkEmptyCellAndAddCellContentToPDFTable(cellNumber,cell,table);
}
cellNumber++;
break;
case Cell.CELL_TYPE_NUMERIC:
cellNumber =checkEmptyCellAndAddCellContentToPDFTable(cellNumber,cell,table);
cellNumber++;
break;
}
}
temp = 1;
if(numberOfColumns != cellNumber){
for(int i=0;i<(numberOfColumns-cellNumber);i++){
table.addCell(" ");
}
}
}
So when I execute this,I will get the pdf file with only one column.But I want same as my excel format.How can I achieve this in my code dynamically(I have to apply this logic for other excel files also)?
You can use this approach to iterate each cell of every row .
Sheet sheet = workbook.getSheetAt(0);
//Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
if(isRowEmpty(row)){
System.out.println("Row "+row.getRowNum()+"is a empty row");
continue;
}
Iterator<Cell> cellIterator = row.cellIterator();
Cell cell =null;
while (cellIterator.hasNext()) {
cell = cellIterator.next();
switch (cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
String value = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
Double d = cell.getNumericCellValue();
break;
case Cell.CELL_TYPE_STRING:
String value = cell.getStringCellValue().trim();
break;
case Cell.CELL_TYPE_BLANK:
break;
}
}
}
Related
Using apache poi, I make Excel data reading logic.
but, the output data comes out incorrectly because the null value is not processed.
What should I do here?
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch (cell.getCellType()) {
case NUMERIC:
System.out.print((int) cell.getNumericCellValue() + "\t");
break;
case STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
}
}
System.out.println();
You need to do the check of null value in the cell.
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext()) {
Cell cell = cellIterator.next();
if(cell==null) {
System.out.print("nothing"+ "\t");
continue;
}
switch (cell.getCellType()) {
case NUMERIC:
System.out.print((int) cell.getNumericCellValue() + "\t");
break;
case STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
}
}
System.out.println();
cont. on java apache poi (part 1)
Code
...
while(rowIterator.hasNext()){
List<String> record = new ArrayList<String>();
row = (XSSFRow)rowIterator.next();
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()){
cell = cellIterator.next();
cell.setCellType(Cell.CELL_TYPE_STRING);
switch(cell.getCellType()){
case Cell.CELL_TYPE_STRING:
record.add(cell.getStringCellValue());
break;
case Cell.CELL_TYPE_NUMERIC:
record.add(Double.toString
(cell.getNumericCellValue()));
break;
}
}
readFile();
}
public void readFile(){
String ID = record.get(0);
System.out.println(ID);
}
...
From above code, my output is like below:
ID
1
2
3
My expected output should like this:
1
2
3
My question is how to remove the first row from excel (ID) from the above code?
To skip the first row:
while(rowIterator.hasNext()){
row = (XSSFRow)rowIterator.next();
if(row.getRowNum()==0) {
continue;
}
List<String> record = new ArrayList<String>();
Iterator<Cell> cellIterator = row.cellIterator();
...
readFile();
}
Add rowIterator.next(); above the While loop in the program which ignore the first row.So simple.Hope this helps you.
**rowIterator.next();**
while (rowIterator.hasNext())
{
Row row = rowIterator.next();
//For each row, iterate through all the columns
Iterator<Cell> cellIterator = row.cellIterator();
while (cellIterator.hasNext())
{
Cell cell = cellIterator.next();
//Check the cell type and format accordingly
switch (cell.getCellType())
{
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "t");
break;
}
}
System.out.println("");
}
file.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
I need to read excel file which more than 300 rows. I need to extract value from particular cell only.
Code
Workbook workbook = Workbook.getWorkbook(new File(excelFile));
Sheet sheet = workbook.getSheet(0);
Cell emp_name = sheet.getCell(1,2);
Cell emp_dpt = sheet.getCell(2,2);
Cell emp_pdpt = sheet.getCell(3,2);
Cell emp_no = sheet.getCell(4,2);
Cell emp_desn = sheet.getCell(5,2);
Cell emp_dj = sheet.getCell(6,2);
Cell emp_lvl = sheet.getCell(7,2);
Cell emp_eval = sheet.getCell(8,2);
String name = emp_name.getContents();
String dpartment = emp_dpt.getContents();
String pre_department = emp_pdpt.getContents();
String employee_no = emp_no.getContents();
String designation = emp_desn.getContents();
String datejoined = emp_dj.getContents();
String evalution = emp_eval.getContents();
System.out.println(name);
System.out.println(dpartment);
System.out.println(pre_department);
System.out.println(employee_no);
System.out.println(designation);
System.out.println(datejoined);
System.out.println(evalution);
Above code helps me to fetch data from the excel but only one value extracted. How do I fetch all the data from excel.
Do it in a loop
When you say , sheet.getCell(1,2), you read the cell with column 1 and row 2.
Support if you want to read , column 1 and row 3, then do this sheet.getCell(1,3);
sheet.getRows() ->Returns the number of rows in this sheet
pseudo code:
for (int rowNum = 5; rowNum < sheet.getRows(); rowNum++) {
int column = 4;
sheet.getCell(column ++, rowNum).getContents(); //read 4th column and 5th row into a variable or object as per your logic;
sheet.getCell(column ++, rowNum).getContents(); //read 5th column and 5th row;
......
}
you can use iterator that allows you to read each and every cell
see example here
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
//For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch(cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t\t");
break;
}
}
im developing one tool for uploading excel and validate it, but excel file is large and the row count is about 65536.
here is my code used for uploading and reading the excel sheet values
int firstColNo = 1;
int rowcount = sheet.getRows();
int colCount = sheet.getColumns();
int row = 0;
String comp = "";
for (row = 1; row < rowcount; row++) {
if (labelCell != null) {
cell = sheet.getCell(firstColNo, row);
if (cell.getContents() != null && cell.getContents().length() > 0){
String compoundId = cell.getContents();
System.out.println(compoundId);
} else {
System.out.println("-");
}
}
}
by reading the row values it takes more to time to read, is there any way to make it faster else any code modifications need to be done in my code?
can anybody help me to overcome this issue.
Here is an example for you
HSSFWorkbook workbook = new HSSFWorkbook(file);
//Get first sheet from the workbook
HSSFSheet sheet = workbook.getSheetAt(0);
//Iterate through each rows from first sheet
Iterator<Row> rowIterator = sheet.iterator();
while(rowIterator.hasNext()) {
Row row = rowIterator.next();
//For each row, iterate through each columns
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
switch(cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t\t");
break;
}
}
System.out.println("");
}
I have a huge excel file with tons of columns which looks like this :-
Column1 Column2 Column3 Column4 Column5
abc def ghi
mno pqr
......
This is the code that I wrote to print these values:
try {
FileInputStream inputStr = new FileInputStream(fileName);
XSSFWorkbook xssfWork = new XSSFWorkbook(inputStr) ;
XSSFSheet sheet1 = xssfWork.getSheetAt(0);
Iterator rowItr = sheet1.rowIterator();
while ( rowItr.hasNext() ) {
XSSFRow row = (XSSFRow) rowItr.next();
System.out.println("ROW:-->");
Iterator cellItr = row.cellIterator();
while ( cellItr.hasNext() ) {
XSSFCell cell = (XSSFCell) cellItr.next();
System.out.println("CELL:-->"+cell.toString());
}
}
} catch (Exception e) {
e.printStackTrace();
}
The output generated by this code is :-
ROW:-->
CELL:-->Column1
CELL:-->Column2
CELL:-->Column3
CELL:-->Column4
CELL:-->Column5
ROW:-->
CELL:-->abc
CELL:-->def
CELL:-->ghi
ROW:-->
CELL:-->mno
CELL:-->pqr
So, If we look at the output above we can note that the cells where I left blank values was not picked up by the POI library , is there a way in which I can get these values as null. or a way to recognize that the values presented skipped blank cells?
Thanks.
If you want to get all cells, no matter if they exist or not, then the iterator isn't for you. Instead, you need to manually fetch the appropriate cells, likely with a missing cell policy
for(Row row : sheet) {
for(int cn=0; cn<row.getLastCellNum(); cn++) {
// If the cell is missing from the file, generate a blank one
// (Works by specifying a MissingCellPolicy)
Cell cell = row.getCell(cn, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
// Print the cell for debugging
System.out.println("CELL: " + cn + " --> " + cell.toString());
}
}
There's more details on all of this in the Apache POI documentation on iterating over cells
I have been frustrated by this same problem. Here is what I found with poi-3.7-20101029 and poi-3.8.
RowIterator and CellIterator do not support iterating over NULL cells or rows -- only physically defined cells (which can be BLANK).
The solution that returns what I expect requires using the 0-based Row.getCell([int], Row.CREATE_NULL_AS_BLANK), much like Chavira's answer alludes to (assuming 8 cell rows). Or you can use the Cell.columnIndex value while iterating to check for jumping numbers...
Annoyingly, after creating blank cells using method #1, the iterators will return the now created BLANK cells. I consider it a bug that MissingCellPolicy is ignored by CellIterator.
The reason is quite simple: Excel files can contain as many rows and as many columns as possibles, so returning all available blank rows and columns will render the cells huge and memory intensive.
Assuming you have a 10x10 sheet, in Excel, it's not "exactly" 10x10 since you can add 11x10 very easily with blank cell, so should POI return the 11th column?
One way to do what you're requesting is to use HSSFCell.getColumnIndex().
Example:
//Assuming your have a 2 dimensional array.
String[][] values = ......;// It is assigned
POIFSFileSystem fileSystem = new POIFSFileSystem(new FileInputStream(fileName));
HSSFWorkbook workbook = new HSSFWorkbook(fileSystem);
//Going through every worksheet.
for (int sheetPos = 0; sheetPos < workbook.getNumberOfSheets(); sheetPos++) {
HSSFSheet sheet = workbook.getSheetAt(sheetPos);
int rowPos = 0;
Iterator<Row> rows = sheet.rowIterator();
while (rows.hasNext()) {
HSSFRow row = (HSSFRow) rows.next();
Iterator<Cell> cells = row.cellIterator();
while (cells.hasNext()) {
HSSFCell cell = (HSSFCell) cells.next();
String value = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC:
value = BigDecimal.valueOf(cell.getNumericCellValue()).toPlainString();
break;
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_BLANK:
value = "";
break;
case HSSFCell.CELL_TYPE_FORMULA:
value = cell.getCellFormula();
break;
default:
break;
}
values[rowPos][cell.getColumnIndex()] = value;
}
rowPos++;
}
}
Below is what worked for me. The "row.CREATE_NULL_AS_BLANK" did not appear to be valid but that could be lack of NPOI knowledge.
HSSFCell dataCell= (HSSFCell)row.GetCell(column, NPOI.SS.UserModel.MissingCellPolicy.CREATE_NULL_AS_BLANK);
for(org.apache.poi.ss.usermodel.Row tmp : hssfSheet){
for(int i = 0; i<8;i++){
System.out.println(tmp.getCell(i));
}
}
This worked for me....
int rowNumber;
int previousCell;
int currentCell;
int currentRowNumber;
HSSFCell cell;
while (rows.hasNext()) {
previousCell = -1;
currentCell = 0;
while (cellIterator.hasNext()) {
cell = (HSSFCell) cellIterator.next();
currentCell = cell.getColumnIndex();
if (previousCell == currentCell-1) {
//...
}
else {
System.out.println("Blank cell found");
}
previousCell = currentCell;
}
}
List cellDataList = new ArrayList();
int lineNumber = 0;
while (rowIterator.hasNext()) {
HSSFRow hssfRow = (HSSFRow) rowIterator.next();
//System.out.println("Befor If");
lineNumber++;
if(lineNumber==1){continue;}
//System.out.println("Out side if ");
Iterator<Cell> iterator = hssfRow.cellIterator();
List<Cell> cellTempList = new ArrayList();
int current = 0, next = 1;
while (iterator.hasNext()) {
Cell hssfCell = iterator.next();
current = hssfCell.getColumnIndex();
if(current<next){
System.out.println("Condition Satisfied");
}
else{
int loop = current-next;
System.out.println("inside else Loop value : "+(loop));
for(int k=0;k<loop+1;k++){
System.out.println("Adding nulls");
cellTempList.add(null);
next = next + 1;
}
}
cellTempList.add(hssfCell);
next = next + 1;
System.out.println("At End next value is : "+next);
}
cellDataList.add(cellTempList);
}
public String[] rowToString(Row row)
{
Iterator<Cell> cells = row.cellIterator() ;
String[] data = new String[row.getLastCellNum()] ;
int previousCell = 0 ;
Cell cell = cells.next() ;
int currentCell = cell.getColumnIndex();
while (true)
{
if (previousCell == currentCell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_NUMERIC:
data[previousCell] = cell.getNumericCellValue()+"" ;
break;
case Cell.CELL_TYPE_STRING:
data[previousCell] = cell.getStringCellValue() ;
break;
/* // there could be other cases here.
case Cell.CELL_TYPE_FORMULA:
data[previousCell] =eval.evaluateFormulaCell(cell);
break;
case Cell.CELL_TYPE_BOOLEAN:
data[previousCell] = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
data[previousCell] = "";
break;
case Cell.CELL_TYPE_ERROR:
data[previousCell] = "ERROR";
break;
*/
}
if(cells.hasNext()){
cell = cells.next() ;
currentCell = cell.getColumnIndex();
} else {
break ;
}
} else {
data[previousCell] = "";
}
previousCell++ ;
}
return data ;
}
for (Row row: sheet){
// This will return null if cell is empty / blank
Cell cell = row.getCell(columnNumber);
}