319d99039e
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@674352 13f79535-47bb-0310-9956-ffa450edef68
335 lines
14 KiB
XML
335 lines
14 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<!--
|
|
====================================================================
|
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
|
contributor license agreements. See the NOTICE file distributed with
|
|
this work for additional information regarding copyright ownership.
|
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
|
(the "License"); you may not use this file except in compliance with
|
|
the License. You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
====================================================================
|
|
-->
|
|
<!DOCTYPE faqs PUBLIC "-//APACHE//DTD FAQ V1.1//EN" "./dtd/faq-v11.dtd">
|
|
|
|
<faqs title="Frequently Asked Questions">
|
|
<faq>
|
|
<question>
|
|
My code uses some new HSSF feature, compiles fine but fails when live with a "MethodNotFoundException"
|
|
</question>
|
|
<answer>
|
|
<p>You almost certainly have an older version of POI earlier
|
|
on your classpath. Quite a few runtimes and other packages
|
|
will ship an older version of POI, so this is an easy problem
|
|
to hit without realising.</p>
|
|
<p>The best way to identify the offending earlier jar file is
|
|
with a few lines of java. These will load one of the core POI
|
|
classes, and report where it came from.</p>
|
|
<source>
|
|
ClassLoader classloader = org.apache.poi.poifs.filesystem.POIFSFileSystem.class.getClassLoader();
|
|
URL res = classloader.getResource("org/apache/poi/poifs/filesystem/POIFSFileSystem.class">
|
|
String path = res.getPath();
|
|
System.out.println("Core POI came from " + path);
|
|
</source>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
My code uses the scratchpad, compiles fine but fails to run with a "MethodNotFoundException"
|
|
</question>
|
|
<answer>
|
|
<p>You almost certainly have an older version earlier on your
|
|
classpath. See the answer to the similar question above for
|
|
how to track this down.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
Why is reading a simple sheet taking so long?
|
|
</question>
|
|
<answer>
|
|
<p>You've probably enabled logging. Logging is intended only for
|
|
autopsie style debugging. Having it enabled will reduce performance
|
|
by a factor of at least 100. Logging is helpful for understanding
|
|
why POI can't read some file or developing POI itself. Important
|
|
errors are thrown as exceptions, which means you probably don't need
|
|
logging.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
What is the HSSF "eventmodel"?
|
|
</question>
|
|
<answer>
|
|
<p>The HSSF eventmodel package is a new API for reading XLS files more efficiently. It does
|
|
require more knowledge on the part of the user, but reduces memory consumption by more than
|
|
tenfold. It is based on the AWT event model in combination with SAX. If you need read-only
|
|
access to a given XLS file, this is the best way to do it.</p>
|
|
</answer>
|
|
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
Why can't read the document I created using Star Office 5.1?
|
|
</question>
|
|
<answer>
|
|
<p>Star Office 5.1 writes some records using the older BIFF standard. This causes some problems
|
|
with POI which supports only BIFF8.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
Why am I getting an exception each time I attempt to read my spreadsheet?
|
|
</question>
|
|
<answer>
|
|
<p>It's possible your spreadsheet contains a feature that is not currently supported by HSSF.
|
|
For example - spreadsheets containing cells with rich text are not currently supported.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
Does HSSF support protected spreadsheets?
|
|
</question>
|
|
<answer>
|
|
<p>Protecting a spreadsheet encrypts it. We wont touch encryption because we're not legally educated
|
|
and don't understand the full implications of trying to implement this. If you wish to have a go
|
|
at this feel free to add it as a plugin module. We wont be hosting it here however.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
How do you tell if a field contains a date with HSSF?
|
|
</question>
|
|
<answer>
|
|
<p>Excel stores dates as numbers therefore the only way to determine if a cell is
|
|
actually stored as a date is to look at the formatting. There is a helper method
|
|
in HSSFDateUtil (since the 1.7.0-dev release) that checks for this.
|
|
Thanks to Jason Hoffman for providing the solution.</p>
|
|
<source>
|
|
case HSSFCell.CELL_TYPE_NUMERIC:
|
|
double d = cell.getNumericCellValue();
|
|
// test if a date!
|
|
if (HSSFDateUtil.isCellDateFormatted(cell)) {
|
|
// format in form of M/D/YY
|
|
cal.setTime(HSSFDateUtil.getJavaDate(d));
|
|
cellText =
|
|
(String.valueOf(cal.get(Calendar.YEAR))).substring(2);
|
|
cellText = cal.get(Calendar.MONTH)+1 + "/" +
|
|
cal.get(Calendar.DAY_OF_MONTH) + "/" +
|
|
cellText;
|
|
} </source>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I'm trying to stream an XLS file from a servlet and I'm having some trouble. What's the problem?
|
|
</question>
|
|
<answer>
|
|
<p>
|
|
The problem usually manifests itself as the junk characters being shown on
|
|
screen. The problem persists even though you have set the correct mime type.
|
|
</p>
|
|
<p>
|
|
The short answer is, don't depend on IE to display a binary file type properly if you stream it via a
|
|
servlet. Every minor version of IE has different bugs on this issue.
|
|
</p>
|
|
<p>
|
|
The problem in most versions of IE is that it does not use the mime type on
|
|
the HTTP response to determine the file type; rather it uses the file extension
|
|
on the request. Thus you might want to add a
|
|
<strong>.xls</strong> to your request
|
|
string. For example
|
|
<em>http://yourserver.com/myServelet.xls?param1=xx</em>. This is
|
|
easily accomplished through URL mapping in any servlet container. Sometimes
|
|
a request like
|
|
<em>http://yourserver.com/myServelet?param1=xx&dummy=file.xls</em> is also
|
|
known to work.
|
|
|
|
</p>
|
|
<p>
|
|
To guarantee opening the file properly in Excel from IE, write out your file to a
|
|
temporary file under your web root from your servelet. Then send an http response
|
|
to the browser to do a client side redirection to your temp file. (Note that using a
|
|
server side redirect using RequestDispatcher will not be effective in this case)
|
|
</p>
|
|
<p>
|
|
Note also that when you request a document that is opened with an
|
|
external handler, IE sometimes makes two requests to the webserver. So if your
|
|
generating process is heavy, it makes sense to write out to a temporary file, so that multiple
|
|
requests happen for a static file.
|
|
</p>
|
|
<p>
|
|
None of this is particular to Excel. The same problem arises when you try to
|
|
generate any binary file dynamically to an IE client. For example, if you generate
|
|
pdf files using
|
|
<link href="http://xml.apache.org/fop">FOP</link>, you will come across many of the same issues.
|
|
|
|
</p>
|
|
<!-- Thanks to Avik for the answer -->
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I want to set a cell format (Data format of a cell) of a excel sheet as ###,###,###.#### or ###,###,###.0000. Is it possible using POI ?
|
|
</question>
|
|
<answer>
|
|
<p>
|
|
Yes. You first need to get a HSSFDataFormat object from the workbook and call getFormat with the desired format. Some examples are <link href="spreadsheet/quick-guide.html#DataFormats">here</link>.
|
|
</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I want to set a cell format (Data format of a cell) of a excel sheet as text. Is it possible using POI ?
|
|
</question>
|
|
<answer>
|
|
<p>
|
|
Yes. This is a built-in format for excel that you can get from HSSFDataFormat object using the format string "@". Also, the string "text" will alias this format.
|
|
</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
How do I add a border around a merged cell?
|
|
</question>
|
|
<answer>
|
|
<p>Add blank cells around where the cells normally would have been and set the borders individually for each cell.
|
|
We will probably enhance HSSF in the future to make this process easier.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I tried to set cell values and Excel sheet name on my native language,
|
|
but I failed to do it. :(
|
|
</question>
|
|
<answer>
|
|
<p>By default HSSF uses cell values and sheet names as compressed unicode,
|
|
so to support localization you should use Unicode.
|
|
To do it you should set it manually:</p>
|
|
<source>
|
|
// for sheet name
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
HSSFSheet s = wb.createSheet();
|
|
wb.setSheetName( 0, "SomeUnicodeName", HSSFWorkbook.ENCODING_UTF_16 );
|
|
|
|
// for cell value
|
|
HSSFRow r = s.createRow( 0 );
|
|
HSSFCell c = r.createCell( (short)0 );
|
|
c.setCellType( HSSFCell.CELL_TYPE_STRING );
|
|
c.setEncoding( HSSFCell.ENCODING_UTF_16 );
|
|
c.setCellValue( "\u0422\u0435\u0441\u0442\u043E\u0432\u0430\u044F" ); </source>
|
|
<p>
|
|
Make sure you make the call to setEncoding() before calling setCellValue(), otherwise what you pass in won't be interpreted properly.
|
|
</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I'm having trouble creating a spreadsheet using POI using
|
|
websphere 3.5.
|
|
</question>
|
|
<answer>
|
|
<p>Make sure you have fix pack 4 installed.</p>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
I am using styles when creating a workbook in POI, but Excel refuses to open the file, complaining about "Too Many Styles".
|
|
</question>
|
|
<answer>
|
|
<p>You just create the styles OUTSIDE of the loop in which you create cells.</p>
|
|
<p>GOOD:</p>
|
|
<source>
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
HSSFSheet sheet = wb.createSheet("new sheet");
|
|
HSSFRow row = null;
|
|
|
|
// Aqua background
|
|
HSSFCellStyle style = wb.createCellStyle();
|
|
style.setFillBackgroundColor(HSSFColor.AQUA.index);
|
|
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
|
|
HSSFCell cell = row.createCell((short) 1);
|
|
cell.setCellValue("X");
|
|
cell.setCellStyle(style);
|
|
|
|
// Orange "foreground", foreground being the fill foreground not the font color.
|
|
style = wb.createCellStyle();
|
|
style.setFillForegroundColor(HSSFColor.ORANGE.index);
|
|
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
|
|
|
|
for (int x = 0; x < 1000; x++) {
|
|
|
|
// Create a row and put some cells in it. Rows are 0 based.
|
|
row = sheet.createRow((short) k);
|
|
|
|
for (int y = 0; y < 100; y++) {
|
|
cell = row.createCell((short) k);
|
|
cell.setCellValue("X");
|
|
cell.setCellStyle(style);
|
|
}
|
|
}
|
|
|
|
// Write the output to a file
|
|
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
|
|
wb.write(fileOut);
|
|
fileOut.close(); </source>
|
|
|
|
<p>BAD:</p>
|
|
<source>
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
HSSFSheet sheet = wb.createSheet("new sheet");
|
|
HSSFRow row = null;
|
|
|
|
for (int x = 0; x < 1000; x++) {
|
|
// Aqua background
|
|
HSSFCellStyle style = wb.createCellStyle();
|
|
style.setFillBackgroundColor(HSSFColor.AQUA.index);
|
|
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);
|
|
HSSFCell cell = row.createCell((short) 1);
|
|
cell.setCellValue("X");
|
|
cell.setCellStyle(style);
|
|
|
|
// Orange "foreground", foreground being the fill foreground not the font color.
|
|
style = wb.createCellStyle();
|
|
style.setFillForegroundColor(HSSFColor.ORANGE.index);
|
|
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
|
|
|
|
// Create a row and put some cells in it. Rows are 0 based.
|
|
row = sheet.createRow((short) k);
|
|
|
|
for (int y = 0; y < 100; y++) {
|
|
cell = row.createCell((short) k);
|
|
cell.setCellValue("X");
|
|
cell.setCellStyle(style);
|
|
}
|
|
}
|
|
|
|
// Write the output to a file
|
|
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
|
|
wb.write(fileOut);
|
|
fileOut.close(); </source>
|
|
</answer>
|
|
</faq>
|
|
<faq>
|
|
<question>
|
|
Will POI read any spreadsheet and rewrite it with modifications.
|
|
</question>
|
|
<answer>
|
|
<p>POI is not guanteed to read the contents of any spreadsheet.
|
|
Certain features may cause spreadsheets to fail to read. More
|
|
problematic is rewriting spreadsheets. POI tried hard to
|
|
preserve the records of the original spreadsheet but some
|
|
features may cause problems. We advise that you limit the
|
|
formatting of spreadsheets you process so as to not be
|
|
unpleasantly suprised at a later stage.</p>
|
|
</answer>
|
|
</faq>
|
|
</faqs>
|