Thanks for that, and further, I just want to confirm that all you need to do
is extract the contents of the cells as formatted Strings. You do not need
to know the cells type so that you could, for exaqmple, recover a date value
for later processing?

If the answer to this question is also yes, then the answer is actually
quite a straightforward one, you need to use a FormulaEvaluator so that the
DataFormatter can actually work out what the cell ought to contain in the
first place - by parsing the formula - and then return it to you as a
String. I ran your file through some code I wrote a while ago for converting
Excel workbooks in CSV files and all seemed to go correctly. So, this
morning, I have copied the relevant piece of code from that class and pasted
it into the message below.

String cellContents = null;

// Open a workbook - this code tagets the SS classes to work with .xls and
.xlsx
Workbook workbook = WorkbookFactory.create(new FileInputStream(new
File("..........")))

DataFormatter formatter = new DataFormatter();
// There are a few ways to create FormulaEvaluators. The one I use
// in the code is this one
FormulaEvaluator evaluator =
workbook.getCreationHelper().createFormulaEvaluator();

// Now all you need to do is get sheets from the workbook and iterate
through the cells
// one at a time storing the refernce into a variable that I have called
cell in
// the code below and will be of type Cell. Then this bit of code will get
you that
// formatted String.


if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
   // Protect the DataFormatter from instances where the cell
   // DOES contain a formula but where that formula actually
   // shows #VALUE! in the cell. In such a case, a call to the
   // getCahcedFormulaResultType() method will return
   // Cell.CELL_TYPE_ERROR and a message can be synthesised for
   // inclusion in the CSV file. It may well be worth indicating
   // to the user that a problem has been detected in the worksheet.
   if (cell.getCachedFormulaResultType() == Cell.CELL_TYPE_ERROR) {
       cellContents = "#VALUE!";
   } else {
       cellContents = this.formatter.formatCellValue(
           cell, this.evaluator);
   }
}
// Finally, in all other cases ( fields that are blank, boolean,
// contain numbers or Strings) rely upon the DataFormatter to return
// a String encapsulating the cells formatted value.
else {
    cellContents = this.formatter.formatCellValue(cell);
}

As you can see, it is far from complete but gives you the idea. It should be
a simple matter of iterating through the sheets and, for each sheet, of
iterating through the cells on the sheet's rows. If you have any further
trouble, or if I have misconstrued what you do need to achieve, just drop a
message onto this list.

Yours

Mark B


Siva_Masilamani wrote:
> 
> Yes you are right.
> 
> 
> 
> MSB wrote:
>> 
>> Can I just confirm that you are referring to the values in column E
>> please? These are the only formulae that I can find at present though I
>> do have to admit I have not looked through the sheets contents throughly
>> yet.
>> 
>> Yours
>> 
>> Mark B
>> 
>> 
>> Siva_Masilamani wrote:
>>> 
>>> Well
>>> 
>>> I did follow the step you mentioned and it seems the cell is of string.
>>> 
>>> Also when i try to get the cell style and read the format it shows the
>>> number as 49 and the format string as @ for all other cells prior to
>>> this and it still throws the same error for this cell but display the
>>> cell format as 49.
>>> 
>>> So i guess the api consides once the cell type is formula it uses parse
>>> double to get the value where it fails as the data contains other
>>> characters too.
>>> 
>>> For your reference i have attached the excel file and the style file.
>>> 
>>> Jankiraman, Radhakrishnan wrote:
>>>> 
>>>> Let me first apologize for not reading your complete email. Something
>>>> with my outlook that gave me the impression that there isn't much
>>>> content below. There seems to be something really wrong in this case.
>>>> From the stack trace, it looks like the cell type is reported to be
>>>> numeric by the getCellType() call, but the date format utility breaks
>>>> while trying to extract the double value for the cell which shouldn't
>>>> happen. This seems like a bug to me. 
>>>> 
>>>> Try opening the .xlsx file with an archive utility like WinZip. Unzip
>>>> the contents. The sheet content is stored under 'xl\worksheets' folder
>>>> with sheets being numbered. Locate your sheet and inspect its contents.
>>>> The styles are stored in 'styles.xml' in the 'xl' folder. 
>>>> 
>>>> You should try taking a look at what the XML looks like for this cell
>>>> content. Check the attributes 't' and 's' for that cell and also what
>>>> the content for the cell looks like. If the cell is indeed numeric then
>>>> the value of 't' must be 'n' and you can also see the value of 's'. It
>>>> must be a number that points to the style index in the workbook styles
>>>> section. The styles are kept in a separate xml 
>>>> 
>>>> But as MSB has suggested in another reply, you should get hold of the
>>>> cell style. From the cell style you'll get the format index. From the
>>>> format index you can get the format string. And that format string
>>>> cannot be directly used as a java format. The format conventions are
>>>> not exactly similar between java and excel. Have you tried reading the
>>>> cell value "as a string" ? Unless you need the typed cell value, you
>>>> might be better off just extracting the formatted string as is.
>>>> 
>>>> -Rk
>>>> 
>>>> __________________________
>>>> Radhakrishnan Jankiraman
>>>> (o) +91.20-30239400 extn 520 (c) +91.9822006056
>>>> 
>>>> 
>>>> -----Original Message-----
>>>> From: Siva_Masilamani [mailto:saachins...@yahoo.co.in] 
>>>> Sent: Wednesday, June 16, 2010 8:29 AM
>>>> To: user@poi.apache.org
>>>> Subject: RE: Read Custom format cell value
>>>> 
>>>> 
>>>> Thanks again.
>>>> 
>>>> But i was reading the api and came to know that we can define our own
>>>> format
>>>> using DataFormatter class like the pre defined format like ssn,us phone
>>>> number,zip code etc.
>>>> 
>>>> But i just don't know how to do that.
>>>> 
>>>> Just incase will that help me...if so could you please provide some
>>>> help on
>>>> that.
>>>> 
>>>> 
>>>> Jankiraman, Radhakrishnan wrote:
>>>>> 
>>>>> Ok. I should have clarified that my suggestion was to use the 'ss'
>>>>> user
>>>>> model APIs introduced in 3.6. These are set of interfaces that provide
>>>>> a
>>>>> way to write code that will work for both xlsx and xls formats ( XSSF
>>>>> and
>>>>> HSSF in the POI world ). So that leads to another question which
>>>>> version
>>>>> of POI are you using ? 
>>>>> 
>>>>> If you don't have control over the format, then no luck. 
>>>>> 
>>>>> -Rk
>>>>> 
>>>>> 
>>>>> -----Original Message-----
>>>>> From: Siva_Masilamani [mailto:saachins...@yahoo.co.in] 
>>>>> Sent: Wednesday, June 16, 2010 4:57 AM
>>>>> To: user@poi.apache.org
>>>>> Subject: RE: Read Custom format cell value
>>>>> 
>>>>> 
>>>>> Hi
>>>>> 
>>>>> Thanks for your reply.
>>>>> 
>>>>> The file is of type xlsx.
>>>>> We are receiving this file from our client and we are in no control of
>>>>> alter
>>>>> the file except reading the data and processing it and storing it in
>>>>> the
>>>>> database.
>>>>> 
>>>>> Also another problem is the same file contains other cells with
>>>>> numeric
>>>>> value and i do not want to alter those values and want to read them as
>>>>> it
>>>>> is.
>>>>> 
>>>>> There are only two fields that are in this format that i need to read.
>>>>> 
>>>>> Im pretty new to this api and learning it at my best and are out of
>>>>> ideas
>>>>> right now.
>>>>> 
>>>>> i am not sure where should i write the code you have given.
>>>>> 
>>>>> Please help.
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> Jankiraman, Radhakrishnan wrote:
>>>>>> 
>>>>>> Btw, you didn't mention the format of your spreadsheet ( i.e. xls or
>>>>>> xlsx
>>>>>> ). I believe the reference should be useful irrespective of that.
>>>>>> 
>>>>>> -----Original Message-----
>>>>>> From: Jankiraman, Radhakrishnan 
>>>>>> Sent: Wednesday, June 16, 2010 2:32 AM
>>>>>> To: 'POI Users List'
>>>>>> Subject: RE: Read Custom format cell value
>>>>>> 
>>>>>> This is how you try to get a format
>>>>>> 
>>>>>>          CreationHelper creationHelper = workbook.getCreationHelper();
>>>>>> 
>>>>>> //If this format is one of the default formats, will return the
>>>>>> format
>>>>>> index else will create a new format and return its index.
>>>>>>          short formatIndex =
>>>>>> creationHelper.createDataFormat().getFormat(format); 
>>>>>>          CellStyle cellStyle = workbook.createCellStyle();
>>>>>>          cellStyle.setDataFormat(formatIndex);
>>>>>>          Cell someCell.setCellStyle(cellStyle);
>>>>>> 
>>>>>> 
>>>>>> Not sure why the cell is of formula type. You should refer to the
>>>>>> Open
>>>>>> XML
>>>>>> format reference to understand how to include text in a number
>>>>>> format.
>>>>>> Refer to section 3.8.30 in the Spreadsheet Markup Reference [1]
>>>>>> 
>>>>>> -Rk
>>>>>> 
>>>>>> [1]
>>>>>> http://www.ecma-international.org/publications/standards/Ecma-376.htm
>>>>>> ( Download Part 4 which contains the complete OOXML reference )
>>>>>> 
>>>>>> 
>>>>>> -----Original Message-----
>>>>>> From: Siva_Masilamani [mailto:saachins...@yahoo.co.in] 
>>>>>> Sent: Tuesday, June 15, 2010 10:52 PM
>>>>>> To: user@poi.apache.org
>>>>>> Subject: Read Custom format cell value
>>>>>> 
>>>>>> 
>>>>>> Hi 
>>>>>> 
>>>>>> I am using apache poi api to read data from the excel file and having
>>>>>> problem with particular data format. 
>>>>>> 
>>>>>> One of the coumns in the excel file had formula type whose value will
>>>>>> be
>>>>>> in
>>>>>> the below format 
>>>>>> 
>>>>>> "2001-160101100-22110-0000-000" 
>>>>>> 
>>>>>> Note : the no of digits between each dash and the number of dash
>>>>>> itself
>>>>>> may
>>>>>> vary but the format will always be numbers followed by - and end with
>>>>>> numbers. 
>>>>>> 
>>>>>> The api successfully find the field type as formula and consider it
>>>>>> as
>>>>>> numeric type but it throws NumberFormatException as it contains -. 
>>>>>> 
>>>>>> I am using DataFormat class to read all the numeric cell value as we
>>>>>> need
>>>>>> to
>>>>>> read the data as it is (no round up or truncate) in the cell value. 
>>>>>> 
>>>>>> I was going through the genral format available in the api but could
>>>>>> not
>>>>>> understand how to add custom format to the list of available formats. 
>>>>>> I was trying to use DataFormat.addFormat(String,Format) from the api
>>>>>> but
>>>>>> did
>>>>>> not understand what to pass in the String argument and how to define
>>>>>> the
>>>>>> Format for this custom format. 
>>>>>> 
>>>>>> Your help is appreciated. 
>>>>>> 
>>>>>> 
>>>>>>    public String getCellValue(Cell cell) {   
>>>>>>         String retVal;   
>>>>>>         if (cell == null) {   
>>>>>>             return "";   
>>>>>>         }   
>>>>>>         switch (cell.getCellType()) {   
>>>>>>   
>>>>>>             case Cell.CELL_TYPE_BLANK:   
>>>>>>                 retVal = "";   
>>>>>>                 break;   
>>>>>>   
>>>>>>             case Cell.CELL_TYPE_BOOLEAN:   
>>>>>>                 retVal = "" + cell.getBooleanCellValue();   
>>>>>>                 break;   
>>>>>>   
>>>>>>             case Cell.CELL_TYPE_STRING:   
>>>>>>                 retVal = cell.getStringCellValue();   
>>>>>>                 System.out.print(retVal + " ");   
>>>>>>                 break;   
>>>>>>   
>>>>>>             case Cell.CELL_TYPE_NUMERIC:   
>>>>>>                 retVal = isNumberOrDate(cell);   
>>>>>>                 System.out.print(retVal + " ");   
>>>>>>                 break;   
>>>>>>   
>>>>>>             case Cell.CELL_TYPE_FORMULA:   
>>>>>>                 retVal = isNumberOrDate(cell);   
>>>>>>                 System.out.print(retVal + " ");   
>>>>>>                 break;   
>>>>>>   
>>>>>>             default:   
>>>>>>                 retVal = "";   
>>>>>>         }   
>>>>>>         return retVal;   
>>>>>>     }   
>>>>>>   
>>>>>>     private String isNumberOrDate(Cell cell) {   
>>>>>>         String retVal;   
>>>>>>         if (HSSFDateUtil.isCellDateFormatted(cell)) {   
>>>>>>             DateFormat formatter = new
>>>>>> SimpleDateFormat("dd/MM/yyyy");   
>>>>>>             retVal = formatter.format(cell.getDateCellValue());   
>>>>>>   
>>>>>>         } else {   
>>>>>>             DataFormatter df = new DataFormatter();   
>>>>>>             //This is where i am trying to add the custom format to
>>>>>> the
>>>>>> list
>>>>>> to already available formats.   
>>>>>>             //DecimalFormat def=new DecimalFormat("#-#");    
>>>>>>             //df.addFormat("", def);   
>>>>>>             retVal = df.formatCellValue(cell);   
>>>>>>         }   
>>>>>>         return retVal;   
>>>>>>     }    
>>>>>>    public String getCellValue(Cell cell) {
>>>>>>         String retVal;
>>>>>>         if (cell == null) {
>>>>>>             return "";
>>>>>>         }
>>>>>>         switch (cell.getCellType()) {
>>>>>> 
>>>>>>             case Cell.CELL_TYPE_BLANK:
>>>>>>                 retVal = "";
>>>>>>                 break;
>>>>>> 
>>>>>>             case Cell.CELL_TYPE_BOOLEAN:
>>>>>>                 retVal = "" + cell.getBooleanCellValue();
>>>>>>                 break;
>>>>>> 
>>>>>>             case Cell.CELL_TYPE_STRING:
>>>>>>                 retVal = cell.getStringCellValue();
>>>>>>                 System.out.print(retVal + " ");
>>>>>>                 break;
>>>>>> 
>>>>>>             case Cell.CELL_TYPE_NUMERIC:
>>>>>>                 retVal = isNumberOrDate(cell);
>>>>>>                 System.out.print(retVal + " ");
>>>>>>                 break;
>>>>>> 
>>>>>>             case Cell.CELL_TYPE_FORMULA:
>>>>>>                 retVal = isNumberOrDate(cell);
>>>>>>                 System.out.print(retVal + " ");
>>>>>>                 break;
>>>>>> 
>>>>>>             default:
>>>>>>                 retVal = "";
>>>>>>         }
>>>>>>         return retVal;
>>>>>>     }
>>>>>> 
>>>>>>     private String isNumberOrDate(Cell cell) {
>>>>>>         String retVal;
>>>>>>         if (HSSFDateUtil.isCellDateFormatted(cell)) {
>>>>>>             DateFormat formatter = new
>>>>>> SimpleDateFormat("dd/MM/yyyy");
>>>>>>             retVal = formatter.format(cell.getDateCellValue());
>>>>>> 
>>>>>>         } else {
>>>>>>             DataFormatter df = new DataFormatter();
>>>>>>             //This is where i am trying to add the custom format to
>>>>>> the
>>>>>> list
>>>>>> to already available formats.
>>>>>>             //DecimalFormat def=new DecimalFormat("#-#"); 
>>>>>>             //df.addFormat("", def);
>>>>>>             retVal = df.formatCellValue(cell);
>>>>>>         }
>>>>>>         return retVal;
>>>>>>     }   
>>>>>> 
>>>>>> 
>>>>>> java.lang.NumberFormatException: For input string:
>>>>>> "2001-160101100-22110-0000-000" 
>>>>>> at
>>>>>> java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
>>>>>>  
>>>>>> at
>>>>>> java.lang.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1207)
>>>>>>  
>>>>>> at java.lang.Double.parseDouble(Double.java:220) 
>>>>>> at
>>>>>> org.apache.poi.xssf.usermodel.XSSFCell.getNumericCellValue(XSSFCell.java:197)
>>>>>>  
>>>>>> at
>>>>>> org.apache.poi.ss.usermodel.DateUtil.isCellDateFormatted(DateUtil.java:278)
>>>>>>  
>>>>>> at
>>>>>> com.excel.reader.ExcelDataReader.isNumberOrDate(ExcelDataReader.java:166)
>>>>>>  
>>>>>> at
>>>>>> com.excel.reader.ExcelDataReader.getCellValue(ExcelDataReader.java:154) 
>>>>>> at com.excel.reader.ExcelDataReader.process(ExcelDataReader.java:118) 
>>>>>> at com.excel.reader.ExcelDataReader.main(ExcelDataReader.java:249) 
>>>>>> Exception in thread "main" ACBS 2001 7528080 Java Result: 1 
>>>>>>  
>>>>>> 
>>>>>> -- 
>>>>>> View this message in context:
>>>>>> http://old.nabble.com/Read-Custom-format-cell-value-tp28894102p28894102.html
>>>>>> Sent from the POI - User mailing list archive at Nabble.com.
>>>>>> 
>>>>>> 
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>>>> 
>>>>>> 
>>>>>> ---------------------------------------------------------------------
>>>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>>>> 
>>>>>> 
>>>>>> 
>>>>> 
>>>>> -- 
>>>>> View this message in context:
>>>>> http://old.nabble.com/Read-Custom-format-cell-value-tp28894102p28897577.html
>>>>> Sent from the POI - User mailing list archive at Nabble.com.
>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>>> 
>>>>> 
>>>>> 
>>>> 
>>>> -- 
>>>> View this message in context:
>>>> http://old.nabble.com/Read-Custom-format-cell-value-tp28894102p28898543.html
>>>> Sent from the POI - User mailing list archive at Nabble.com.
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
>>>> For additional commands, e-mail: user-h...@poi.apache.org
>>>> 
>>>> 
>>>> 
>>>  http://old.nabble.com/file/p28904075/styles.xml styles.xml 
>>> http://old.nabble.com/file/p28904075/sheet1.xml sheet1.xml 
>>> http://old.nabble.com/file/p28904075/SPD_REF_QRM_PLANNING_RC_20100531.xlsx
>>> SPD_REF_QRM_PLANNING_RC_20100531.xlsx 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://old.nabble.com/Read-Custom-format-cell-value-tp28894102p28910810.html
Sent from the POI - User mailing list archive at Nabble.com.


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@poi.apache.org
For additional commands, e-mail: user-h...@poi.apache.org

Reply via email to