Getting Columns of Row which is inside a List - java

I have a List which is having rows fetched from the JDBC.
I am iterating over the List like
for (int i = 0; i < myList.size(); i++) {
myList.get(i);// it returns me Row
// I want to get the column value with column index.
}
Please let me know how can I get all the column values of that row by indexes.
Thanks,
KP

Related

How to loop arraylist string with increment in Apache POI

I am stuck with my loop where I want to loop the arraylist of string that contain data like this
[A,B,C,D,E,F]
where I want to loop the arraylist at the top row only like the image down below. The result that I get when I run the code here is the the same as the first image.
Row roww1 = sheet.createRow(0);
for (int i = 0; i < shiftname.size(); i++) {
Cell toprow = roww1.createCell(i + 4);
toprow.setCellValue(shiftname.get(i));
}
This is the outcome that I want it to be

Why ArrayIndexOutOfBoundsException error on Jtable having one element

I want to add jTable elements to a list. It works fine when jTable have more then one element, but it gives me the the following error when jTable have one element. Why so? How to resolve it. Thank You.
Here is the error.
Error: Exception in thread "AWT-EventQueue-0"
java.lang.ArrayIndexOutOfBoundsException: 1 >= 1
Here is the code:
DefaultTableModel table_tags = (DefaultTableModel)this.jTable_selectedTags.getModel();
int rowCount=table_tags.getRowCount();
Vector data = table_tags.getDataVector();
Vector row = (Vector) data.elementAt(1);
int mColIndex = 0;
List tags_data = new ArrayList(rowCount);
for (int i = 0; i < table_tags.getRowCount(); i++) {
row = (Vector) data.elementAt(i);
tags_data.add(row.get(mColIndex));
}
System.out.println(tags_data);
The issues was in accessing of index. So, after changing
Vector row = (Vector) data.elementAt(1);
to
Vector row = (Vector) data.elementAt(0);
It worked fine.
Your for loop is wrong. You iterate the table using this condition:
for (int i = 0; i < table_tags.getRowCount(); i++)
Problem is that you use the row count to perform the iteration. Given only one element in the Vector your row count would indeed by 1 but using this to iterate over the table would cause it to fail, since the only element at the table would at index 0. Change your above condition to:
for (int i = 0; i < table_tags.getRowCount() - 1; i++)
And I suppose you'll be fine.

Export Java HashMap to xlsx

I need convert HashMaps to xlsx using poi. For sheet data2 i need something like that:
table1:
But i have table2:
Here's my list of HashMaps:
rows=[{kol2=s, kol1=s}, {kol2=bbbb, kol3=bbbb, kol1=aaaa}, {kol2=bbbb, kol3=bbbb, kol1=aaaa}, {kol2=bbbb, kol3=bbbb, kol1=aaaa}, {kol2=s, kol1=s}]}
Here's my code:
XSSFWorkbook workBook = new XSSFWorkbook();
XSSFSheet sheet = workBook.createSheet("data");
XSSFSheet sheet2 = workBook.createSheet("data2");
int rowCount = 0;
int help = 1;
List<HashMap<String, Object>> rows = ((List<HashMap<String, Object>>) x);
int rowCount2 = 0;
int header = 1;
Row header2 = sheet2.createRow(0);
for (int i = 0; i < rows.size(); i++) {
int li = 0;
Row row2 = sheet2.createRow(++rowCount2);
HashMap<String, Object> row = rows.get(i);
int columnCount2 = 0;
for (HashMap.Entry<String, Object> subElement : row.entrySet()) {
if (subElement.getValue() != null) {
if (i == li) {
Cell cell = header2.createCell(header);
cell.setCellValue(subElement.getKey().toString());
header++;
}
li++;
Cell cell2 = row2.createCell(++columnCount2);
cell2.setCellValue(subElement.getValue().toString());
}
}
}
Someone can help?
Iterating over a HashMap's EntrySet
The first problem is that you are iterating over the entrySet of your HashMap
for (HashMap.Entry<String, Object> subElement : row.entrySet()) {
// no guaranteed order
}
Looking at the JavaDoc of the Set#iterator() method you will see this:
Returns an iterator over the elements in this set. The elements are returned in no particular order (unless this set is an instance of some class that provides a guarantee).
There are Sets which are ordered (such as the TreeSet), but since you are using a HashMap, your EntrySet won't be ordered too.
Notice the column order in your sheet is kol2-kol3-kol1. Don't you want it to be kol1-kol2-kol3?
Not creating empty columns
You are forgetting to create empty cells for columns you don't have in your Map.
if (subElement.getValue() != null) {
// there won't be an empty cell if you e.g. don't have kol2 in your rows Map,
// since this just skips your current value
}
This is why you end up with something like:
kol2 kol3 kol1
s s
bbbb bbbb aaaa
...
instead of:
kol2 kol3 kol1
s s
bbbb bbbb aaaa
...
Creating the header row inside the loop
By creating the header row inside your loop, you are making your solution more complicated than necessary. It would be much easier just to create the header row and then loop over your entries in the List.
if (i == li) {
Cell cell = header2.createCell(header);
cell.setCellValue(subElement.getKey().toString());
header++;
}
If you are doing this outside the loop, there is no need for the li and the header variable
Suggested solution
I would (for a start) come up with something like this (I added some extra comments I normally wouldn't put there to make more clear what the intentions are and what aspects of the solution you need to understand):
XSSFSheet sheet2 = workBook.createSheet("data2");
List<HashMap<String, Object>> rows = ((List<HashMap<String, Object>>) x);
List<String> headers = Arrays.asList("kol1", "kol2", "kol3");
int currentRowNumber = 0;
// create header row
Row header = sheet2.createRow(currentRowNumber);
for (int i = 0; i < headers.size(); i++) {
Cell headerCell = header.createCell(i);
headerCell.setCellValue(headers.get(i));
}
// create data rows (we loop over the rows List)
for (int i = 0; i < rows.size(); i++) {
HashMap<String, Object> row = rows.get(i);
// we neet to increment the rowNumber for the row in the sheet at the beginning of
// each row. entry 0 in the rows List is in sheetRow 1, entry 1 in sheetRow 2, etc.
currentRowNumber++;
Row sheetRow = sheet2.createRow(currentRowNumber);
// we can now loop over the columns inside the row loop (using the headers List)
// we create a Cell for each column, but only fill it if there is
for (int j = 0; j < headers.size(); j++) {
Cell cell = sheetRow.createCell(j);
// only fill the cell if we are having data in the row map for the current column
String currentColumnName = headers.get(j);
if (row.containsKey(currentColumnName)) {
cell.setCellValue(row.get(currentColumnName).toString());
}
}
}
If you want a different column order, just change the header List and you are done (e.g. Arrays.asList("kol2", "kol3", "kol1")).

how to get the number of rows used in a particular column

I m using getLastRowNum() and getPhysicalNumberOfCells() for the number of used rows and columns respectively but its not giving the correct index of the row.
int lastRowNum = sheetAt.getLastRowNum();
int lastColNum = sheetAt.getRow(0).getPhysicalNumberOfCells();
Any other option to find out the same???
Rows and Cells can be missing, and there is no built in function to return the number of cells used in a column. So you have to write the function yourself.
int count = 0;
for (Row row : sheet) {
if (row.getCell(5) != null) {
count += 1;
}
}
This retrieves the number of used cells in column F.

Dynamically creating rows in Excel sheet with Apache POI

I'm writing a program to read a large xml file and create an excel file from it. The attributes of each node will be the column headers in excel file. I created a Dom object and got the nodelist. I need to iterate through it and for each node, i need to add a row in excel sheet with the node's attributes values as column values. So, when iterating, i need to create rows dynamically. How can i do it? I dont see a functionality to add created rows in apache POI, so far what i have seen is to define new rows everytime. I'm unable to do it since it has more than 5000 entries. Basically what i want to do is:
Node node = null;
HSSFRow datarow = null;
for (int i = 0; i < nodeList.getLength(); i++) {
node = nodeList.item(i);
datarow = spreadSheet.createRow(i);
//set values for data row here, and add it.
//so in the loop, next time the same variable will be assigned to spreadSheet.createRow(1) etc.
}
I understand that the createRow is invoked from spreadSheet, which will add the row to it. But in the loop, the same variable will be assigned to other rows too, so i think finally i will get only 1 row. Please advice me on this.
Try the following
Node node = null;
HSSFRow datarow = null;
for (int i = 0; i < nodeList.getLength(); i++) {
// On each loop you get the value of node item
node = nodeList.item(i);
//For every new node list you will create a row
datarow = spreadSheet.createRow(i);
//Finally set the node value to the columns of the newly created Row
}
Hope this helps !!
createRow has already created the row in the worksheet and is returning a reference to the newly created row. You will lose this reference on the next loop iteration but it will not remove/override the previous row from the worksheet. You can expect to have the correct number of rows in the end.
int totalRows = 5;
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Data");
HSSFRow datarow = null;
for (int i = 0; i <= totalRows; i++) {
datarow = sheet.createRow(i);
datarow.createCell(0).setCellValue(Integer.toString(i));
}
System.out.println("Total Rows: " + sheet.getLastRowNum());
System.out.println("First row cell value: " + sheet.getRow(0).getCell(0).getStringCellValue());
System.out.println("Last row cell value: " + sheet.getRow(totalRows).getCell(0).getStringCellValue());
/*
Total rows: 5
First row cell value: 0
Last row cell value: 5
*/

Categories

Resources