- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我为 jExcelApi 类创建了一个包装器,以便轻松地将对象列表导出到 Excel。为了最大限度地减少对象创建,单元格格式被创建为静态字段,并在连续的导出调用中重复使用。但我对日期格式有问题 - 第一次调用效果很好,但在所有连续导出的日期单元格中,日期单元格都具有数字格式而不是日期格式。如果我为日期格式创建一个新对象而不是使用静态字段,一切都很好。对不同的工作表或工作簿使用相同的格式对象会失败吗?
这是代码,简化了异常处理,省略了其他数据类型,并且可能缺少一些导入:
ExcelCellGenerator.java:
import jxl.write.WritableCell;
public interface ExcelCellGenerator<T> {
WritableCell getCell(int col, int row, T arg);
}
ExcelCellGeneratorFactory.java:
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.NumberFormat;
import jxl.write.NumberFormats;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import ExcelExporter.DateTimeExtractor;
final class ExcelCellGeneratorFactory {
private ExcelCellGeneratorFactory() {}
private static final WritableCellFormat DATE_FORMAT = new WritableCellFormat ( new DateFormat ("dd MMM yyyy hh:mm:ss")); // reusing this field fails
static public <T> ExcelCellGenerator<T> createDateCellGenerator(final DateTimeExtractor<T> extractor) {
return new ExcelCellGenerator<T>() {
public WritableCell getCell(int col, int row, T arg) {
return new DateTime(col, row, extractor.extract(arg), DATE_FORMAT);
// if there is new WritableCellFormat(new DateFormat(...)) instead of DATE_FORMAT, works fine
}
};
}
}
ExcelExporter.java:
import jxl.Workbook;
import jxl.write.DateFormat;
import jxl.write.DateTime;
import jxl.write.Label;
import jxl.write.NumberFormat;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
public class ExcelExporter<T> {
// describe a column in Excel sheet
private static class ColumnDescription<T> {
public ColumnDescription() {}
// column title
private String title;
// a way to generate a value given an object to export
private ExcelCellGenerator<T> generator;
}
// all columns for current sheet
private List<ColumnDescription<T>> columnDescList = new ArrayList<ColumnDescription<T>>();
// export given list to Excel (after configuring exporter using addColumn function
// in row number rowStart starting with column colStart there will be column titles
// and below, in each row, extracted values from each rowList element
public byte[] exportList(int rowStart, int colStart, List<? extends T> rowList) {
final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
WritableWorkbook workbook;
try {
workbook = Workbook.createWorkbook(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
final WritableSheet sheet = workbook.createSheet("Arkusz1", 0);
int currRow = rowStart;
try {
int currCol = colStart;
for (ColumnDescription<T> columnDesc : columnDescList) {
final Label label = new Label(currCol, currRow, columnDesc.title);
sheet.addCell(label);
currCol++;
}
currRow++;
for (T object : rowList) {
currCol = colStart;
for (ColumnDescription<T> columnDesc : columnDescList) {
sheet.addCell(columnDesc.generator.getCell(currCol, currRow, object));
currCol++;
}
currRow++;
}
workbook.write();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return outputStream.toByteArray();
}
// configure a Date column
public ExcelExporter<T> addColumn(String title, DateTimeExtractor<T> extractor) {
final ColumnDescription<T> desc = new ColumnDescription<T>();
desc.title = title;
desc.generator = ExcelCellGeneratorFactory.createDateCellGenerator(extractor);
columnDescList.add(desc);
return this;
}
// and test that shows the problem
public static void main(String []args) {
final ExcelExporter<Date> exporter = new ExcelExporter<Date>();
exporter.addColumn("Data", new DateTimeExtractor<Date>() {
public Date extract(Date date) {
return date;
}});
// this file looks OK
FileOutputStream ostream = new FileOutputStream("C:\\tmp\\test1.xls");
try {
ostream.write(exporter.exportList(0, 0, Collections.singletonList(new Date())));
} finally {
ostream.close();
}
// but in this file date is shown in cell with numeric format
final ExcelExporter<Date> exporter2 = new ExcelExporter<Date>();
exporter2.addColumn("Data", new DateTimeExtractor<Date>() {
public Date extract(Date date) {
return date;
}});
ostream = new FileOutputStream("C:\\tmp\\test2.xls");
try {
ostream.write(exporter2.exportList(0, 0, Collections.singletonList(new Date())));
} finally {
ostream.close();
}
}
}
最佳答案
Telcontar 的回答很有帮助,因为它说明这是一个功能,而不是错误,但还不够,因为它没有提供任何指向常见问题解答或文档的链接。所以我做了一些研究,发现了一个 FAQ上面写着:
also, it's important that you Do Not declare your cell formats as static. As a cell format is added to a sheet, it gets assigned an internal index number.
所以答案是 - 格式不能在不同的工作表中重复使用,因为它们不是为以这种方式重复使用而设计的。
关于java - jExcelApi - 单元格日期格式重用不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1460673/
在 Excel 中,我可以在一个单元格中拥有多种文本样式。有没有办法使用 JExcelApi 创建这样的文件?到目前为止我没有看到任何东西:setCellFormat 是 WritableCell 上
我一直在使用 JExcelAPI 在 Java 中编写和读取 Excel 文件。当我读取由 JExcelAPI 编写的文件时,它工作正常,但如果我使用 OpenOffice 等其他程序修改 .xls
如何使用第三方库? 我已经下载了它,但不确定如何处理它,我是否将它放在我的 Eclipse 项目文件夹等中? 我确实在网站上查看过,但没有结果 谢谢 最佳答案 您需要在项目类路径中设置 jar。导入后
我想知道是否可以使用 Java JExcepAPI 创建一个包含文本“Red Rose Blue Sky”的 Excel 文件单元格(标签),其中“Rose”显示为红色,“Blue”显示为 - 你猜怎
我可以使用以下命令找到 Excel 文档中的行数sheet.getRows();但是我的 Excel 文件中的行长度不同,我怎样才能只获取 1 列中的行数。我发现了 getting rows in f
我为 jExcelApi 类创建了一个包装器,以便轻松地将对象列表导出到 Excel。为了最大限度地减少对象创建,单元格格式被创建为静态字段,并在连续的导出调用中重复使用。但我对日期格式有问题 - 第
我正在使用 JExcelApi 生成 XLS 文件。来自 jxl.format.Colour ,我了解了如何获取“标准 Excel 调色板”中的任何颜色,但没有了解如何创建新颜色(例如,给定其 RGB
首先我要说的是,我对 Java 和这个网站都很陌生。我现在已经读了一两本书,从那时起我就一直在寻找小项目来让自己开心。我尝试对此进行研究,但无法找到我需要的信息。话虽如此,这是我的第一个问题,所以如果
我需要检测单元格内的文本是否被删除。我正在使用这个: Cell cc = sheet.getCell("B1"); CellFormat format = cc.getCellFormat(); Sy
我有一个 Excel 工作表,其中包含一些非英语字符,当我尝试通过 获取内容时 sheet.getColumn(column)[row].getContents() 它返回带有替换字符\uFFFD 的
我使用 jexcelapi for android . 我写字符串“Hello jExcelAPI!”,但是当我读的时候我看到了中文符号。 我该如何解决? 提前致谢。 附言也许有帮助:我不知道需要在
这是我的第一篇文章,请多多包涵。我正在尝试做一些简单的事情:查看包含公式的电子表格单元格的值。似乎什么都不起作用,我得到的不是正确答案(579),而是“4”。 (输出如下)。该程序创建一个简单的电子表
当我添加 JExcelAPI 时 http://jexcelapi.sourceforge.net/到类路径并运行我的应用程序,我得到:编写输出时遇到问题:不应该发生[2009-07-16 14:32
我有一个成功导出到 Excel 的 Jasper 报告,但是所有数字列(当前为 java.math.BigDecimal 类型)在 Excel 中显示为“常规”类型。这使得无法对列进行数字运算(例如添
我正在用 JExcelApi 编写电子表格. 我有两个要应用货币格式的单元格。通过阅读 API,我发现了 jxl.write.NumberFormat,它似乎可以满足我的要求。在我的应用程序中,我写了
我安装了java并设置了路径,运行成功。现在我需要的是如何使用 jexcelapi。我下载了 jexcel api 并将其解压缩。我不知道在哪里放置提取的文件,也不知道如何为 jexcel 文件设置
我正在使用 JExcelApi 生成 xls 文件。现在我需要的是锁定标题,因为我有超过 300 行。 每当我滚动时,我都需要显示标题。谁能帮我解决这个问题。我浏览了很多网站,但没有找到解决方案。 O
在尝试使用 jExcelAPI 读取 xls 文件时,我发现该库在 stderr 中转储了大量信息,有时这些信息不相关。例如,此代码片段会导致大量“警告”转储到 stderr 流上: Work
我尝试使用 JExcelAPI (v. 2.6.3) 在 Java 应用程序中生成一些 Excel 工作表,但无法正确生成日期单元格。例如,对于代码: WritableWorkbook workboo
我正在使用 Java 编写 MS Excel 文件,以及如何设置“跟踪更改”标志,以便我可以看到人们稍后进行修改的位置。如何在 jexcelapi 或 Apache HSSF 中设置此标志? 最佳答案
我是一名优秀的程序员,十分优秀!