I am exporting an Excel sheet using NatTable (Eclipse Nebula). It contains an image in the header layer and some text in the header as well as body. Here is the code for configuration:
ImagePainter bgImagePainter = new ImagePainter(getImg());
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_PAINTER, bgImagePainter, DisplayMode.NORMAL, HeaderLayout.overImg);
configRegistry.registerConfigAttribute(CellConfigAttributes.CELL_STYLE, cellStyle, DisplayMode.NORMAL, HeaderLayout.overImg);
Also, I use ExcelExporter to export the data to an Excel Workbook.
I don't know where the error could be, because the text in all other columns is displayed perfectly. If you need to look at any other code snippet, I will update it.
I don't see the what the "error" could be, since you are not telling what your issue is. But I suppose your question is why the image is not exported. And AFAIK the reason is that the NatTable exporter does not support exporting of images at the moment.
Related
Using Apache POI,
I successfully copied all my data, but ive lost all my formatting, eg font, foreground color etc.
heres what ive tried
destCell.getCellStyle().setAlignment(srcCell.getCellStyle().getAlignment());
destCell.getCellStyle().setFont(srcCell.getCellStyle().getFont());
destCell.getCellStyle().setFillForegroundColor(srcCell.getCellStyle().getFillForegroundColorColor());
tried this for font still not working
XSSFFont font = new XSSFFont();
font.setFontName(srcSheet.getRow(currentRowIndex).getCell(currCellIndex).getCellStyle().getFont().getFontName());
font.setFontHeightInPoints(srcSheet.getRow(currentRowIndex).getCell(currCellIndex).getCellStyle().getFont().getFontHeightInPoints());
font.setColor(srcSheet.getRow(currentRowIndex).getCell(currCellIndex).getCellStyle().getFont().getColor());
font.setFamily(srcSheet.getRow(currentRowIndex).getCell(currCellIndex).getCellStyle().getFont().getFamily());
destSheet.getRow(currentRowIndex).getCell(currCellIndex).getCellStyle().setFont(font);
and this gives me an error
destSheet.getRow(currentRowIndex).getCell(currCellIndex).setCellStyle(srcSheet.getRow(currentRowIndex).getCell(currentRowIndex).getCellStyle());
This Style does not belong to the supplied Workbook Styles Source. Are you trying to assign a style from one workbook to the cell of a different workbook?
This is the source format
This is how it looked after i copied over using apache poi
I would recommend you to first create a CellStyle with your destination-workbook and add to that one the required parameters from your source-cells. Then apply that CellStyle to your destination-cells.
In my experience the CellStyle object can be a little bit tricky, and the safest way is to create a CellStyle at first.
I am trying to copy an excel workbook to another excel workbook(some cell values needs some calculations as per)
I need to copy the CellStyles as well, as there are Data and Amount fields with styling.
Im using the below lines of code :
CellStyle cellStyle = wb_out.createCellStyle();
cellStyle.cloneStyleFrom(cell_in.getCellStyle());
Cell cell_out = row_out.createCell(cellIndex);
cell_out.setCellValue(value);
cell_out.setCellStyle(cellStyle);
For large files,
The cloneStyleFrom throws ArrayIndexOutofBound error,
How do we fix this.
Thanks in advance.
Basically there's a limit to number of Styles that one can create,
and if the excel sheet is a large file, the limit crosses and the error 'ArrayIndexOutofBound' is thrown.This is called Style explosion.
To escape this scenario, you have to create separate cell styles and use it wherever is required
This is what I tried and it worked.
I created a cell style for the Date format and Currency format, and applied those wherever required.
CellStyle cellStyleDate = wb_out.createCellStyle();
short dateFormat = wb_out.createDataFormat().getFormat("d-mmm");
cellStyleDate.setDataFormat(dateFormat);
CellStyle cellStyleCurrency = wb_out.createCellStyle();
short currencyFormat = wb_out.createDataFormat().getFormat("#,##0.0");
cellStyleCurrency.setDataFormat(currencyFormat);
Likewise one can create a cell style and add different specific format or properties to it and use it in the workbook,
like this :
cell_out.setCellStyle(cellStyleDate);
I would like to provide a way for a sheet name to be specified by a command. The sheet names should be dynamically created based on the content in the sheet.
I note that it is possible to specify fixed sheet names for dynamic sheets when using the multisheet attribute of each-command.
In the version 1 documentation there is a reference to the ability to rename a sheet using ${workbook.setSheetName(0, department.name)}. Can this be used in v2? How is it supposed to work? Would workbook need to be added to the context or was it previously available?
I tried renaming the sheet in a custom command but it seems that there is too much dependence on sheet names in XlsArea for the name to be changed halfway through XlsArea.applyAt. The template sheet is not deleted and processing is not completed.
I thought about trying to get the custom command to add an area listener to change the sheet name. But the area listeners are only called on the parent area which I cannot access from within the command.
Thanks,
Wayne.
I doubt this is the correct way to do it, but til now this is the only way I've managed to do it:
Context context = PoiTransformer.createInitialContext();
Workbook workbook = WorkbookFactory.create(templateInputStream);
workbook.setSheetName(0, "newName");//Changing name of the first sheet
PoiTransformer transformer = PoiTransformer.createTransformer(workbook);
transformer.setOutputStream(resultOutputstream);
JxlsHelper.getInstance().processTemplate(context, transformer);
If you use multisheet generation feature you can just pass your own CellRefGenerator to Each-Command and create the sheet names dynamically in it.
Currently it is not possible to pass the CellRefGenerator in Excel template but it should be quite straightforward to add this functionality.
Or you can set the CellRefGenerator with Java code as shown in the documentation.
It can be done using folowing method of XLSTransformer class.
XLSTransformer transformer = new XLSTransformer();
setSpreadsheetToRename(oladSheetName, String newSheetName)
I am using Apache POI to generate xlsx sheet for reports. One of the POI generated report I saved as another using Microsoft excel . When comparing the original file and the saved file there was 12Mb difference. The original file was 15Mb while the saved file is just 2.5Mb. The Workbook used is XSSFWorkbook.
Is it possible to reduce the file size created by Apache POI
Here is the code snippet I have used:
XSSFWorkbook workbookTitle = new XSSFWorkbook(fileInputStream);
workbook = new SXSSFWorkbook(workbookTitle, maxRows);
font = workbook.createFont();
font.setFontHeightInPoints((short) 9);
font.setFontName(FONT_NAME);
cellTwoDecimal = workbook.createCellStyle();
DataFormat format = workbook.createDataFormat();
cellTwoDecimal.setDataFormat(format.getFormat("0.00"));
cellTwoDecimal.setFont(font);
cellCommon = workbook.createCellStyle();
cellCommon.setFont(font);
cellText = workbook.createCellStyle();
cellText.setDataFormat((short) BuiltinFormats.getBuiltinFormat("text"));
cellText.setFont(font);
cellWrpText = workbook.createCellStyle();
cellWrpText.setWrapText(true);
cellWrpText.setFont(font);
Row row;
Cell cell;
for (int i = 0; i < size; i++) {
row = excelSheet.createRow(rowIndex++);
cell = row.createCell(i);
cell.setCellValue(rowHeader);
cell.setCellStyle(cellCommon);
}
I have removed some internal logics from code. Please share your ideas.
[Edit 1]
I am inserting a lot of blank cells where there is no value, ie. some part of the report will not have any value. So I put a blank cell there. I am also setting style for the blank cell. Can this be the reason?
Thanks in advance.
According to your "edit 1"... if i understand you correctly you create cells with no value.
you do not have to do so. if you dont want to write something then do not create the empty cell.
on my poi-experience you only have to create rows and cells if you want to write something.
from this point of view it is clear, that your xlsx is very large (many many cell-objects). i think MS Excel removes the empty cells on manual save.
added: Need to mention that there is also an issue with styling your cells. please try to use as few as possible instances of CellStyle. if you have cells with same style do not create a new instance of CellStyle with same attributes. please apply the same instance of CellStyle. Also do not assign style to simple text cells. in this case excel uses a default style (background='white', textcolor='black', font='any default', size='any default', format='default').
I had a similar problem, and later figured out that I was opening the FileOutputStream in append mode(append=true). The file size grew exponentially(say from 7KB to 54KB) every-time I update a single cell on the sheet.
When removed the append, it worked just fine.
I am populating URL into Excel sheet through java code. But the hyperlink is not enabled if I populate through Java code.
If I type URL into Excel sheet directly, hyperlink automatically coming. Could you please let me know why it is not coming if I populate through code.
You may need Worksheet_followhyperlink enabled in the spreadsheet through vba. I've encountered this populating hyperlinks into Excel before. Pop this into the sheet with the links:
Private Sub Worksheet_followhyperlink(ByVal Target As Hyperlink)
Application.EnableEvents = True
Target.Follow
' Any other code you might need.
End Sub