我目前正在使用NPOI根据我的asp.net mvc应用程序中的数据库生成Excel文件.我几乎完成了代码,除了在尝试将日期写入Excel时我一直得到的一个小问题.
在数据库(MS SQL Server)中,我将日期保存为41883,41913等...在C#中我可以使用它转换为DataTime对象
DateTime dt = DateTime.FromOADate(Convert.ToDouble(41883));
Run Code Online (Sandbox Code Playgroud)
我用来写日期到Excel的代码看起来像这样:
var cell = excelRow.CreateCell(columnIndex);
IDataFormat format = workbook.CreateDataFormat();
short dateFormat = format.GetFormat("dd/MM/yyyy");
cell.SetCellValue(DateTime.FromOADate(Convert.ToDouble(dbDateValue)));
ICellStyle cellStyle = workbook.CreateCellStyle();
cellStyle.DataFormat = dateFormat;
cell.CellStyle = cellStyle;
Run Code Online (Sandbox Code Playgroud)
这只是我的代码示例(正在编写日期的部分).这段代码的问题是只有部分日期单元格实际上被格式化为日期,对于所有其他日程单元格我仍然看到数据库41883,41913等中的值当然我可以选择并应用短日期/从Excel格式化日期(但我不希望如此).
任何人都可以让我知道为什么会出现这样的行为(格式化仅适用于部分单元格)...我甚至尝试使用HSSFDataFormat.GetBuiltinFormat("Date"),但在这种情况下没有格式化单元格.

上面的图片更好地解释了我的问题...当我选择第一列中的第一个单元格时,我看到单元格被格式化为"自定义"...对于所有其他未格式化的值,它是常规.一旦我选择了单元格,我可以将其格式化为Excel中的日期,没有任何问题.这很奇怪,因为对所有日期单元执行相同的代码,但只有一些得到正确的格式...
我有一个现有的excel电子表格,我正在访问并从中读取值,我正在使用Apache POI HSSF.
它初始化如下:
HSSFSheet sheet;
FileInputStream fis = new FileInputStream(this.file);
POIFSFileSystem fs = new POIFSFileSystem(fis);
HSSFWorkbook wb = new HSSFWorkbook(fs);
this.sheet = wb.getSheet(exsheet);
Run Code Online (Sandbox Code Playgroud)
我正在遍历工作表中存在的所有单元格,这将生成一个单元格对象:
HSSFCell cell = (HSSFCell) cells.next();
Run Code Online (Sandbox Code Playgroud)
请熟悉该框架的人解释如何创建一个(HSSFColor)对象来表示工作表中每个单元格的背景颜色.
非常感谢
编辑,更新
要清楚我想知道的是:如何为现有单元格的背景颜色创建/获取HSSFColor对象?
cell.getCellStyle().getFillBackgroundColor();
Run Code Online (Sandbox Code Playgroud)
此代码仅返回一个短数字,而不是HSSFColor对象.谢谢你到目前为止的答案.
我正在使用Apache POI-HSSF将图片添加到单元格中.图像是120x100,但无论我做什么以及如何调整它,Excel电子表格总是显示它跨越多行并将其扭曲到比宽度更大的高度.
如何保持原始尺寸?
我的代码:
InputStream is = new FileInputStream(getImageURL());
byte[] bytes = IOUtils.toByteArray(is);
int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);
is.close();
//add a picture shape
CreationHelper helper = wb.getCreationHelper();
ClientAnchor anchor = helper.createClientAnchor();
// Create the drawing patriarch. This is the top level container for all shapes.
Drawing drawing = sheet1.createDrawingPatriarch();
//set top-left corner of the picture,
//subsequent call of Picture#resize() will operate relative to it
anchor.setAnchorType(0);
anchor.setCol1(1);
anchor.setRow1(1);
Picture pict = drawing.createPicture(anchor, pictureIdx);
//auto-size picture relative to its top-left corner
pict.resize(); …Run Code Online (Sandbox Code Playgroud) 我喜欢一个很好的原生Python库来编写XLS,但它似乎并不存在.令人高兴的是,Jython确实如此.
所以我想在jexcelapi和Apache HSSF之间做出决定:http ://www.andykhan.com/jexcelapi/tutorial.html#writing http://poi.apache.org/hssf/quick-guide.html
(我不能使用COM自动化,因为我不在Windows上,即使我是,我也买不起Office许可证.)
我最初的想法是POI/HSSF非常彻底,但也非常Java--一切似乎都比它需要的更难.良好的文档,但我的头痛害试图弥合它描述的内容和我需要完成的之间的差距.
jexcepapi似乎有一个更简单,更好(对我来说)的界面,但没有很好的文档或社区.
你会用哪个,为什么?
我有Apache POI项目的问题.
我没有使用XSSF,并HSSF在"同一个Java类".我应该下载哪个jar或者我应该将哪些工件添加到maven中?
我要同时处理xls,并xlsx在同一时间的文件.当我得到excel版本错误时,我会将XSSF更改为HSSF或HSSF更改为XSSF.
我怎样才能做到这一点?
我正在尝试使用POI XSSF来评估一些Excel公式.这些值不必保存,我可能需要计算很多公式,所以我试图在同一个单元格中完成所有这些.
问题是即使在我重新计算之后,单元格值似乎仍然卡在输入的第一个公式上
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
XSSFCell formulaCell = row.createCell(6);
formulaCell.setCellFormula("Date(2011,10,6)");
CellValue cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
formulaCell.setCellFormula("Date(1911,3,4)");
cellValue = evaluator.evaluate(formulaCell);
System.out.println(cellValue.getNumberValue());
Run Code Online (Sandbox Code Playgroud)
这两次输出40822.0 40822.0(excel相当于10/6/2011),而不是重新评估新公式.
我尝试在java中使用apache poi读取excel文件,但Eclipse没有编译代码.
public class ReadExcel {
public static void main(String[] args) throws IOException {
FileInputStream file = new FileInputStream(new File("C:\\Users\\XXXXXXXXXXXXXXXXal\\042012.xls"));
HSSFWorkbook wb = new HSSFWorkbook(file);
HSSFSheet sheet = wb.getSheetAt(0);
Iterator<Row> rowIterator = sheet.iterator();
while (rowIterator.hasNext()) {
Row row = rowIterator().next(); \\ THIS LINE GETS UNDERLINED BY ECLIPSE!!!
Iterator<Cell> cellIterator = row.cellIterator();
while(cellIterator.hasNext()) {
Cell cell = cellIterator.next();
System.out.print(cell.getStringCellValue() + "\t\t");
}
}
file.close();
FileOutputStream out =
new FileOutputStream(new File("C:\\test.xls"));
wb.write(out);
out.close();
}
}
Run Code Online (Sandbox Code Playgroud)
Eclipse始终强调Row row = rowIterator().next();行.我不知道为什么?我怎样才能改进它?
我正在尝试使用CellStylesfor 来配置用于格式化的泛型.HSSFCellsApache-POI 3.11
这是代码的可运行示例.正确应用粗体和边框格式.问题在于背景和前景颜色.
我有什么不对的任何线索?
public class TestSO {
private final static short
MY_LIGHT_BLUE=100,
MY_DARK_BLUE=101,
MY_BLACK=102,
MY_WHITE=103;
public static void main(String[]args) throws Exception{
HSSFWorkbook workbook = new HSSFWorkbook();
setPallete( workbook.getCustomPalette() );
HSSFFont fontNormal = workbook.createFont();
fontNormal.setFontHeightInPoints((short)11);
fontNormal.setFontName("Calibri");
HSSFFont fontBold = workbook.createFont();
fontBold.setFontHeightInPoints((short)11);
fontBold.setFontName("Calibri");
fontBold.setBold(true);
HSSFCellStyle titleStyle = workbook.createCellStyle();
titleStyle.setFillBackgroundColor(MY_DARK_BLUE);
titleStyle.setFillForegroundColor(MY_WHITE);
titleStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
titleStyle.setFont(fontBold);
setTopBotBorder(titleStyle);
HSSFCellStyle fpStyle = workbook.createCellStyle();
fpStyle.setFillBackgroundColor(MY_LIGHT_BLUE);
fpStyle.setFillForegroundColor(MY_BLACK);
fpStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
fpStyle.setFont(fontNormal);
setTopBotBorder(fpStyle);
HSSFSheet sheet = workbook.createSheet("Leyenda");
HSSFCell cell;
cell = sheet.createRow( 1 ).createCell( 1 );
cell.setCellValue("TitleStyle"); …Run Code Online (Sandbox Code Playgroud)