java如何使用XSSF(Apache POI 3.8)调整图表的大小?
我想知道是否有一种方法可以使用ApachePOI(XSSF)调整图表的大小。目前我使用的是Excel模板,它有一个图表,当使用namedRanges插入更多数据时,图表会发生变化
一切正常,我面临的唯一问题是:
- 图表总是保持相同的大小,因此如果有更多的条目,它会变得杂乱无章,使图表变得毫无用处李>
- 我使用的是日期,但我无法在图表上以日/月(17/10)表示日期。基本上,它写的是36982,而不是2001年1月4日李>
工作簿的目的是列出几个作业,并检查它们在给定日期是否花费了更长的时间。图表有助于识别经过更长时间的情况。作业运行时的范围可能从秒到小时
这是我正在使用的代码:
package le_package.poi_tests.xssflibrary;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Name;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class POIReadFile {
public static void main(String[] args) {
try
{
String jobName = "I am a job";
String jobParent = "I am your father, Job.";
int rowNum = 40;
int deface = 4;
//Open Excel as OOXML
XSSFWorkbook currentWorkbook = new XSSFWorkbook( OPCPackage.open("include/excelTemplate.xlsx"));
//Get sheet in position 0
Sheet currentSheet = currentWorkbook.getSheetAt(0);
//Get sheet name for processing
String sheetName = currentSheet.getSheetName();
//Set values for headers
currentSheet.getRow(1).getCell(0).setCellValue(jobName);
currentSheet.getRow(1).getCell(1).setCellValue(jobParent);
for (int i=0; i<rowNum; i++)
{
//Create row in a given position
Row newRow = currentSheet.createRow(i+deface);
//Create cell within row
Cell newCell0 = newRow.createCell(0);
Cell newCell1 = newRow.createCell(1);
Cell newCell2 = newRow.createCell(2);
String cellDate = "";
/* Set CellType
* 0 - Numeric | 1 - String | 2 - Formula | 3 - Blank | 4 - Boolean | 5 - Error */
newCell0.setCellType(0);
cellDate = "3/"+(i+1)+"/2001 00:00:00";
//Convert text into date
Date currentCellDate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(cellDate);
//System.out.println(currentCellDate.toString()+"--"+cellDate);
//Set CellValue
newCell0.setCellValue(currentCellDate);
cellDate = "4/"+(i+1)+"/2001 00:00:00";
currentCellDate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").parse(cellDate);
//System.out.println(currentCellDate.toString()+"--"+cellDate);
newCell1.setCellType(0);
newCell1.setCellValue(currentCellDate);
//setCellFormula sets the formula to be evaluated by excel, it doesn't need to start with '='
newCell2.setCellFormula("A" + (i+deface+1) + "-B" + (i+deface+1));
}
//Search for named range
Name rangeCell = currentWorkbook.getName("startRange");
//Set new range for named range
String reference = sheetName + "!$A$" + ( deface+1 ) + ":$A$" + ( rowNum+deface );
//Assigns range value to named range
rangeCell.setRefersToFormula(reference);
rangeCell = currentWorkbook.getName("endRange");
reference = sheetName + "!$B$"+(deface+1) + ":$B$" + (rowNum+deface);
rangeCell.setRefersToFormula(reference);
rangeCell = currentWorkbook.getName("elapsedTime");
reference = sheetName + "!$C$"+(deface+1) + ":$C$" + (rowNum+deface);
rangeCell.setRefersToFormula(reference);
//Create a fileStream to write into a file
FileOutputStream newExcelFile = new FileOutputStream(jobName+".xlsx");
//Write Stream
currentWorkbook.write(newExcelFile);
//Close New Excel File
newExcelFile.close();
}
catch (Exception e)
{
System.out.println("AAAAARGH, I was wounded by the following exception!:");
e.printStackTrace();
System.out.println("Sorry, your program is dead :(");
}
}
}
有可能做我需要的吗
谢谢
*注意:我不是要求从头开始创建图表,我只需要调整模板的大小,并将一些单元格更改为日期,而不是写入的数字
# 1 楼答案
在研究了xlsx的工作原理之后,我找到了如何完成它的方法
如果你有任何意见,请告诉我
# 2 楼答案
给出你的日期单元格,日期格式。 Apache poi date format
POI无法修改图形AFAIK