我有Apache POI项目的问题.
我没有使用XSSF,并HSSF在"同一个Java类".我应该下载哪个jar或者我应该将哪些工件添加到maven中?
我要同时处理xls,并xlsx在同一时间的文件.当我得到excel版本错误时,我会将XSSF更改为HSSF或HSSF更改为XSSF.
我怎样才能做到这一点?
我知道我们可以通过遍历所有的行,并要求获得列的最大数量getLastCellNumber每行对象..但这种方法需要循环访问所有这些我想避免,因为这将需要大量的时间,文件一百万行行(这是我期望阅读的那种文件).
当POI读取excel文件时,它会将表单维度(第一行编号,最后一行编号,第一个编号,最后一个编号)存储在DimensionsRecord类的对象中.所以,如果我得到这个对象,我会得到我需要的东西.这些对象可以从Sheet类获得,Sheet类是POI的内部类.我能够提取XLS文件所需的内容,但是我遇到了XLSX文件的障碍.
POI是否DimensionsRecord也为XLSX 维护对象?如果是,有人试图提取它吗?还是有其他一些可以做到这一点?请帮忙!
此外,我想问问,我的做法是否正确与否,也就是我使用POI的内部类(这是我的工作做完),这是正确的,或者我应该仅仅依靠公开的API(太耗时).
我发现以下代码从现有模板创建excel表格,并使用格式并向其添加数据并将其保存到新文件
POIFSFileSystem fs = new POIFSFileSystem(
new FileInputStream("template.xls"));
HSSFWorkbook wb = new HSSFWorkbook(fs, true);
Will load an xls, preserving its structure (macros included). You can then modify it,
HSSFSheet sheet1 = wb.getSheet("Data"); ...
Run Code Online (Sandbox Code Playgroud)
然后保存它.
FileOutputStream fileOut = new FileOutputStream("new.xls");
wb.write(fileOut);
fileOut.close();
Run Code Online (Sandbox Code Playgroud)
这绝对没问题.但我的问题是我现在正在处理新版本的excel.所以我需要开发一个类似的代码来处理新版本的模板.有人可以建议我怎么做?我尝试将HSSWorkbook更改为XSSFWorkbook.但是XSSFWorkbook没有允许我传递布尔值的构造函数.也.当我尝试它时,它会复制数据,但带有数据的行不会保留模板所具有的列的格式.
我正在编写一个用Apache POI eventmodel(SAX/XSSF)导入xlsx文件的程序.我差不多完成了,但我无法得到正确的日期.
我正在解析具有日期值的单元格
<c r="D1" s="1">
<v>41319.558333333334</v>
</c>
Run Code Online (Sandbox Code Playgroud)
我正在使用org.apache.poi.ss.usermodel.DateUtil课程来获取日期:
DateUtil.getJavaCalendar(doble date, bool use1904windowing);
Run Code Online (Sandbox Code Playgroud)
我应该通过什么use1904windowing来获得正确的日期?我暂时使用false,因为这给了我测试工作簿的正确日期,但我知道我应该从某个地方读取这个值.
有DateWindow1904Record二进制xls格式的记录,我用HSSF读取.它与XSSF的对应关系是什么?或者我应该经常使用false?
编辑:@rgettman回答指出我的解决方案,但它不完整.在事件模型中,您没有xssfWorkbook对象,您不能只获取它的CTWorkbook().
相反,您可以直接从InputStream创建CTWorkbook:
OPCPackage pkg = OPCPackage.open(filename);
XSSFReader r = new XSSFReader( pkg );
InputStream workbookXml = r.getWorkbookData();
CTWorkbook ctWorkbook = CTWorkbook.Factory.parse(workbookXml);
boolean isDate1904 = ctWorkbook.getWorkbookPr().getDate1904();
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用apache poi创建单元格注释.我可以创建注释,但默认情况下它们始终显示在excel中.我必须手动右键单击单元格并取消勾选显示注释以使它们不可见(现在它们仅在我悬停在单元格上时出现).默认情况下是否可以使单元格注释不可见(以便在用户将鼠标悬停在单元格上之前它们不会出现在Excel中.)
这是我使用的代码:
Drawing drawing = cell.getSheet().createDrawingPatriarch();
CreationHelper factory = cell.getSheet().getWorkbook().getCreationHelper();
ClientAnchor anchor = factory.createClientAnchor();
anchor.setCol1(cell.getColumnIndex());
anchor.setCol2(cell.getColumnIndex() + 1);
anchor.setRow1(cell.getRowIndex());
anchor.setRow2(cell.getRowIndex() + 3);
Comment comment = drawing.createCellComment(anchor);
RichTextString str = factory.createRichTextString(message);
comment.setVisible(Boolean.FALSE);
comment.setString(str);
cell.setCellComment(comment);
Run Code Online (Sandbox Code Playgroud) 我正在使用apache poi和XLSX文件.我使用xssf类动态创建电子表格.我想在for循环中设置单元格的样式,但它似乎不起作用......这是我的代码:
for(int i=1;i<=gc.getActualMaximum(GregorianCalendar.DAY_OF_MONTH);i++,gc.add(GregorianCalendar.DATE, 1),righe++){
Row r = foglio.createRow(righe);
if(getDayOfWeek(gc)== 6 || getDayOfWeek(gc) == 7){
XSSFCellStyle cs1 = wb.createCellStyle();
cs1.setFillBackgroundColor(IndexedColors.YELLOW.getIndex());
cs1.setFillPattern(CellStyle.SOLID_FOREGROUND);
XSSFFont f = wb.createFont();
f.setBold(true);
f.setColor(IndexedColors.RED.getIndex());
cs1.setFont(f);
Cell c1 = r.createCell(0);
c1.setCellValue(cost.getGiorni().get(getDayOfWeek(gc)-1).getNomeGiorno());
c1.setCellStyle(cs1);
Cell c2 = r.createCell(1);
c2.setCellValue(i);
c2.setCellStyle(cs1);
}
r.createCell(0).setCellValue(cost.getGiorni().get(getDayOfWeek(gc)-1).getNomeGiorno());
r.createCell(1).setCellValue(i);
Run Code Online (Sandbox Code Playgroud)
...这只是代码的一部分......我无法理解为什么不工作.似乎像cellstyle被忽略或者被淹没....
任何线索?
我有一个正在阅读的xlsx 文件- Apache POI 库。
例如,在某些行中,我有这样的单元格值:
我的目标是: 将行中的所有单元格读取为字符串值。但正如我所见,我无法将01-Sep-13读取为字符串,它只表示像 Date 类型 () 和 cell.getDateCellValue();
1)我可以以某种方式将 01-Sep-13 读为字符串:“01-Sep-13”;2)如果我有不同的日期模式(ddMMyyyy)和(dd-MMM-yy),我可以将日期值转换为字符串吗?
代码:
当我遍历行和单元格时,Apache POI 会分析每种单元格类型:
String normalizeCellType(Cell cell) {
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
return cell.getRichStringCellValue().getString());
case Cell.CELL_TYPE_NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue(); ????????????
System.out.println(date);
} else {
....
}
break;
case Cell.CELL_TYPE_BOOLEAN:
return ....
case Cell.CELL_TYPE_FORMULA:
return ....
default:
System.out.println();
}
}
Run Code Online (Sandbox Code Playgroud) 几年前,我遇到了使用jXLS和创建大型Excel文件的问题POI XSSF.如果我的记忆是正确的,我认为XSSF会在磁盘上创建类似1GB +临时文件的内容来创建10mb excel文件.所以我停止使用jXLS,而是用来SXSSF创建excel文件,但今天我有新的理由使用jXLS或JETT.
无论jXLS和JETT网站似乎暗示,业绩要好得多,但POI的XSSF网站仍然表示一般的XSSF要求更高的内存占用.我想知道这些更高的内存占用量是否像现在合理的10%开销,或者它仍然像几年前的10,000%开销一样.
POI 3.9修复了疯狂的坏内存问题XSSF吗?我应该不用担心使用它jXLS或JETT?还是有某些难以避免的陷阱?重用细胞样式我很小心.
当我试图在普通的java类中创建一个工作簿时它正在创建,但当我试图在servlet上运行相同的时候它会抛出异常
普通的java类
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class Sampleclass {
public static void main(String[] args) {
FileInputStream file;
try {
file = new FileInputStream(new File("C:\\Users\\Rajasekhar\\Desktop\\EmployeeDetails.xlsx"));
Workbook book=new XSSFWorkbook(file);
System.out.println(book);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
Servlet的
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import …Run Code Online (Sandbox Code Playgroud) 我想看看是否可以使用 Apache POI 更改折线图中系列的数据范围。
我能够从图表本身中提取系列,但找不到允许我更改数据范围的方法。
XSSFWorkbook workbook = new XSSFWorkbook("C:\\Workbook.xlsx");
Sheet worksheet = workbook.getSheetAt(0);
XSSFDrawing drawing = (XSSFDrawing) worksheet.createDrawingPatriarch();
List<XSSFChart> charts = drawing.getCharts();
for (XSSFChart chart : charts) {
String title = chart.getTitleText().toString();
if (title.equals("Z-Acceleration")) {
CTChart cc = chart.getCTChart();
CTPlotArea plotArea = cc.getPlotArea();
CTLineSer[] ccc = plotArea.getLineChartArray()[0].getSerArray();
for (CTLineSer s : ccc) {
System.out.println(s.xmlText());
}
System.out.println(ccc.length);
}
}
Run Code Online (Sandbox Code Playgroud)
我打印出 XML 文本以查看它是否确实能够正确地从图表中提取系列并能够找到其标题和数据范围,但无法更改它。