Does anyone know if using apache-poi library you can change the decimal and thousands separators for Microsoft Excel?
I need to export in excel some data from an web application, and the numbers are formatted depending on some the user's settings. so when the data is exported the numbers should look exactly how they are in the application's page.
Thanks
You need to set your CellStyle dataFormat in this way (if you use integer and want thousand separator)
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("#,##0"));
cell.setCellStyle(cellStyle);
I think that you need something like that: (I didn't try it, so maybe you need to modify it a little bit) #,##0.00
please note: is very important you use comma, and not dot. If your locale is setted correcty, you will see a dot.
Formatting in Excel is controlled through the Tools > Options > International dialogs, and is stored in local preferences, not in a file. So you can't control this through POI.
The only solution I can think of is to provide text rather than numbers. But it will prevent user from doing any calculation in Excel.
There's only formatting. It means this format is my format for formatting numeric. The comma is a symbol equals only part of thousands while the dot is part of decimal. You could use "#,##0.00" or "#,##0" does not matter because Microsoft Excel has local settings of separator applies to the application, not a file, you cannot override via API.
Remember, the sheet has a predefined cell style. A cell has a reference only to style. If you change on cell, you change all cells this type.
I have the same issue with format of cell. I think I try to use the method "setVBAProject" on XSSFWorkbook.
https://social.technet.microsoft.com/Forums/office/en-US/eaa4c7f6-197a-4b33-bc5f-20896e5a7e3a/workbook-or-worksheet-specific-decimal-separator?forum=excel
Related
I have an excel file with 2 pages.
The first page "sheet_n1" have formula with reference to another page =MAX(sheet_n2!A1:sheet_n2!A3)
The second page "sheet_n2" have a table with data.
After saving, I open my excel file as ZIP-archive. And in the XML-file of "sheet_n1" I have apostrophes in formula on second part of range =MAX(sheet_n2!A1:'sheet_n2'!A3)
This does not affect how the formula works in the excel. And I don't see these apostrophes in excel app.
But this affects opening a file using an Apache POI library in my Java application. I have apostrophes when I read a cell with formula
Can someone explain where these apostrophes come from ? And why only in the second part of the formula?
=MAX(17, 'sheet_n2'!A3) is correct syntax. The sheet name is surrounded by inverted commas. That's the rule.
However, Microsoft, in its never ending effort to make things easier, determined that they can be left out if there is no space in the tab name. The consequence is that Excel will remove the commas if there is no space in the name even if you type them. But if you use Excel in other languages, including VBA, the commas will not be removed even though they may not be needed. Appache POI is likely aware of this and would know how to deal with the commas.
=MAX(sheet_n2!A1:'sheet_n2'!A3) is a special case because the second mention of the sheet isn't required. =MAX(sheet_n2!A1:A3) is adequate. So, Excel doesn't quite know what to do with the extra information and leaves it untouched.
Is it possible to get the styles of a paragraph in a particular langage ?. For example: on my personal computer I happen to have a dutch installation of microsoft windows. this is resulting in the paragraph.getStyles() method returning the dutch values of the styles, instead of a normal value of "heading1", "heading2" etc I am receiving values such as"Kop1", "kop2".
I am creating a parser for word based documents which selects certain parts on style. does anyone have any experience with this ?
I would take a look at the data in the .docx file (it's a zip-file) to verify if the data is written this way by Word already or "transposed" by POI or some local functionality.
If the data is already written by Word you will need to check how you can create the document in a different language in Word.
If not, then if you are using POI 3.13 or newer, you can try to set a different locale via LocaleUtil.setUserLocale() and see if that affects the results.
So I am creating a csv report within my java code and using excel to open the exported csv file. One of the column is a date which I am formatting within my code to be mm/dd/yyyy hh:mm:ss. This comes out as 02/10/2014 3:38:00 PM. Which is exactly how I want it. However the columns in the excel sheet display this as 02/10/2014 3:38. When I click on a cell in the excel sheet, it does display the full date at the top but I want it to display on the column itself so that it is easier to print. It doesn't seem like a column width issue since I have changed the column width but the full date still won't appear. I am however able to achieve it by changing the number format cells setting to custom. Is this something that can be done within java itself? Let me know if you need more information. Thanks!
Comma-separated values (CSV) is stores tabular data in plain-text format. To give Excel an instruction how to format a particular column you would need to user Excel format. In order to achieve it, you may use a Java library to export data in Excel format. One example of such a library is Apache POI - the Java API for Microsoft Documents (http://poi.apache.org/).
In addition, to work better with CSV files in Excel use import from text feature. This is a wizard you can specify the import settings, including column formats, width of the fields etc.
I hope it helps.
I have a situation where I have been asked to write a program that essentially does an arbitrary SQL select over JDBC, convert the ResultSet to something loadable in Excel and send it as an attachment in an email.
The question goes for what dataformat to use in order to be loadable by as many different versions of Excel as possible.
I have considered:
XLS - native format, the simplest way to generate seems to be with JExcel.
CSV - comma separated format, must use semicolons instead of commas to cope with European decimal commas, and then there is all the quotation stuff.
HTML - it appears that Excel knows how to read an HTML table. It should be sufficient then to set the MIME-type to be application/vnd.ms-excel
but naturally there must be other interesting ways to do it.
My major concern is incorrect interpretion of the data:
Numbers with decimal commas gets misinterpreted on systems with decimal points.
Character encoding issues (We cannot rely on the recipient using ISO-Latin-#).
Date interpretation - we have earlier found that the YYYY-MM-DD format is pretty robust.
My major concern is robustness. I don't mind it being tedious to code, if I can count on the result being good.
Suggestions and experiences to share?
I am aware of JSP generating Excel spreadsheet (XLS) to download - that page does not discuss robustness.
I'd recommend Andy Khan's JExcel. It's the best library for working with Excel in Java.
Apache hssf
This has always been the chosen method where I've worked in Java development.
It's an acronym for Horrible SpreadSheet Format
The quick way to generate Excel files to to write out tab delineated text and name it <name>.xls. Excel will open any text file ending in .xls as a single worksheet.
I use Apache POI to write excel sheets. I'm very happy with it, but I have the following problem: my program is multi-currency and internationalized. In the excel sheet I write, I want my currency cells to be properly formatted. For that,
I need a routine that would build the right Excel currency format (eg: "[$$-409]#,##0.00;-[$$-409]#,##0.00") from java.util.Currency and java..util.Locale parameters.
Something like: public String getExcelCurrencyFormat(Currency currency, Locale locale);
Is anyone aware of such a library?
Couldn't you just flag the field as being a currency field, and let Excel figure out the right format to use? Or does Excel require you to specify the format to produce the relevant 'type'?
I would have suggested using java.text.NumberFormat.getCurrencyInstance() but there appears to be no way to get the actual format used by the instance from the object itself (unless tostring() returns it).
Off the top of my head I can't think of anything else sorry.