为什么更新数据后,图表样式改变了(并且透视表样式也改变了)?

Workbook workbook = new Workbook(distPath);//模板
	WorksheetCollection worksheets = workbook.getWorksheets();
	Worksheet sheet = worksheets.get(2);
	ListObjectCollection listObjectCollection = sheet.getListObjects();
	ListObject listObject = listObjectCollection.get("ds_table");
	Cells cells = sheet.getCells();
	List<Object[]> data = ResultSetConverter.convert2Array(BaseJDBC.getConnection().createStatement().executeQuery(sql));//数据<a class="attachment" href="/uploads/default/23886">excel.zip</a> (36.7 KB)

	for(int i=1;i<=data.size();i++){
		Object[] obj = data.get(i-1);
		for(int j=0;j<=listObject.getEndColumn()-listObject.getStartColumn();j++){
			cells.get(listObject.getStartRow()+i, j).putValue(obj[j]);
		}
	}
	listObject.resize(listObject.getStartRow(), listObject.getStartColumn(), listObject.getEndRow()+data.size()-1, listObject.getEndColumn(), true);
	PivotTableCollection pivotTables = worksheets.get(1).getPivotTables();
	PivotTable table = pivotTables.get("p_table");
	if(table!=null){
		table.setRefreshDataFlag(true);
		table.refreshData();
		table.calculateData();
		table.setRefreshDataFlag(false);
	}
	workbook.save(distPath);<a class="attachment" href="/uploads/default/23887">正常图表.png</a> (13.9 KB)

问题图表.png (14.9 KB)正常图表.png (13.9 KB)excel.zip (36.7 KB)

@lidabai,

感谢模板文件和截图。

通过手动将输入和输出文件打开到MS Excel看到输入和输出文件后,我注意到与图表样式的区别。我无法测试您的代码段,因为它使用外部数据库将数据导入工作表中的List对象/表。您可以删除数据库依赖项并使用硬编码值(您可以将数据保存在某些数组/列表中,并将数据导入工作表的列表对象/表中,并提供更新的代码段(可执行文件))这样我们就可以了可以尽快评估您的问题。

public static void main(String[] args) throws Exception {
String distPath = “C:/Users/jon/Desktop/share/temporary/test.xlsx”;
Workbook workbook = new Workbook(distPath);
WorksheetCollection worksheets = workbook.getWorksheets();
Worksheet sheet = worksheets.get(2);
ListObjectCollection listObjectCollection = sheet.getListObjects();
ListObject listObject = listObjectCollection.get(“ds_table”);
Cells cells = sheet.getCells();
Random random = new Random(100L);
List<Object[]> data = new ArrayList<Object[]>();
data.add(new Object[]{“2012”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2012”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2012”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2013”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2013”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2013”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2014”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2014”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2014”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2015”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2015”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2015”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2016”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2016”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2016”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2017”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2017”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2017”,“500kV”,random.nextDouble()});
data.add(new Object[]{“2018”,“110kV”,random.nextDouble()});
data.add(new Object[]{“2018”,“220kV”,random.nextDouble()});
data.add(new Object[]{“2018”,“500kV”,random.nextDouble()});
for(int i=1;i<=data.size();i++){
Object[] obj = data.get(i-1);
for(int j=0;j<=listObject.getEndColumn()-listObject.getStartColumn();j++){
cells.get(listObject.getStartRow()+i, j).putValue(obj[j]);
}
}
listObject.resize(listObject.getStartRow(), listObject.getStartColumn(), listObject.getEndRow()+data.size()-1, listObject.getEndColumn(), true);
PivotTableCollection pivotTables = worksheets.get(1).getPivotTables();
PivotTable table = pivotTables.get(“p_table”);
if(table!=null){
table.setRefreshDataFlag(true);
table.refreshData();
table.calculateData();
table.setRefreshDataFlag(false);
}
Chart chart = worksheets.get(0).getCharts().get(0);
chart.refreshPivotData();
chart.calculate();
workbook.save(distPath);
}
以上的代码需修改模板路径。(即使不更新excle中的数据,只是用cell 打开模板,保存操作,透视表和图的样式也会改变)

@lidabai,

感谢您提供示例代码段和更多详细信息。

我使用我们最新的版本/修复测试了你的场景/案例:Aspose.Cells for .NET v19.2.x(请试一试),它工作正常,输出文件中的数据透视表和图表不会改变样式/打印格式。您可以在下载部分或Nuget repos下载最新版本/修复:
例如

如果您仍然发现最新版本的v19.2存在任何问题,请告诉我们更多详情。

@Amjad_Sahi]你好,我使用的是asopse cell for java.版本为18.10(我也尝试下载了最新版本,出现了同样的问题。)

@lidabai,

很抱歉您的问题没有解决。

我尝试使用以下示例代码段来生成两个使用v19.2的输出文件(附件),两者都可以使用图表和数据透视表的样式/格式:

1)

String distPath = "f://files//原始文件.xlsx";
		Workbook workbook = new Workbook(distPath);
		WorksheetCollection worksheets = workbook.getWorksheets();
		Worksheet sheet = worksheets.get(2);
		ListObjectCollection listObjectCollection = sheet.getListObjects();
		ListObject listObject = listObjectCollection.get("ds_table");
		Cells cells = sheet.getCells();
		Random random = new Random(100L);
		List<Object[]> data = new ArrayList<Object[]>();
		data.add(new Object[]{"2012V","110kV",random.nextDouble()});
		data.add(new Object[]{"2012","220kV",random.nextDouble()});
		data.add(new Object[]{"2012","500kV",random.nextDouble()});
		data.add(new Object[]{"2013","110kV",random.nextDouble()});
		data.add(new Object[]{"2013","220kV",random.nextDouble()});
		data.add(new Object[]{"2013","500kV",random.nextDouble()});
		data.add(new Object[]{"2014","110kV",random.nextDouble()});
		data.add(new Object[]{"2014","220kV",random.nextDouble()});
		data.add(new Object[]{"2014","500kV",random.nextDouble()});
		data.add(new Object[]{"2015","110kV",random.nextDouble()});
		data.add(new Object[]{"2015","220kV",random.nextDouble()});
		data.add(new Object[]{"2015","500kV",random.nextDouble()});
		data.add(new Object[]{"2016","110kV",random.nextDouble()});
		data.add(new Object[]{"2016","220kV",random.nextDouble()});
		data.add(new Object[]{"2016","500kV",random.nextDouble()});
		data.add(new Object[]{"2017","110kV",random.nextDouble()});
		data.add(new Object[]{"2017","220kV",random.nextDouble()});
		data.add(new Object[]{"2017","500kV",random.nextDouble()});
		data.add(new Object[]{"2018","110kV",random.nextDouble()});
		data.add(new Object[]{"2018","220kV",random.nextDouble()});
		data.add(new Object[]{"2018","500kV",random.nextDouble()});
		for(int i=1;i<=data.size();i++){
		Object[] obj = data.get(i-1);
		for(int j=0;j<=listObject.getEndColumn()-listObject.getStartColumn();j++){
		cells.get(listObject.getStartRow()+i, j).putValue(obj[j].toString(), true);
		}
		}
		listObject.resize(listObject.getStartRow(), listObject.getStartColumn(), listObject.getEndRow()+data.size()-1, listObject.getEndColumn(), true); 
		PivotTableCollection pivotTables = worksheets.get(1).getPivotTables (); 
		PivotTable table = pivotTables.get("p_table");
		if(table!=null){ 
		table.setRefreshDataFlag(true); 
		table.refreshData (); 
		table.calculateData (); 
		table.setRefreshDataFlag(false); 
		} 
		Chart chart = worksheets.get(0).getCharts().get(0); 
		chart.refreshPivotData(); 
		chart.calculate(); 
		workbook.save("f:\\files\\out1.xlsx");

2)

String distPath1 = "f://files//原始文件.xlsx";
		Workbook workbook1 = new Workbook(distPath1);
		workbook1.save("f:\\files\\out2.xlsx");

files1.zip (37.9 KB)

有可能是我的模版存在问题?因为我观察到你用的是xlsx文件,我的原始模版文件是xlsm文件。麻烦你使用原始文件测试一下;如果可以重现问题,那么模版又存在什么问题呢?

@lidabai,

感谢您提供更多详细信息。

好吧,我在你在帖子的第一篇文章中附上的压缩档案中使用了模板XLSX文件。请压缩您的原始XLSM文件并提供给我们,如果我们可以在我们的最终重现问题,我们将使用我之前粘贴的代码与您的XLSM文件测试您的问题。

你好,我怀疑是我的环境可能存在问题,可以提供一下你的环境吗(如jdk,aspose cells for java 版本,office版本已经项目依赖jar包等)?如果代码、模板你我的都一致,那么我怀疑我的环境也许存在问题(特别是office版本)

@lidabai,

我使用Aspose.Cells for Java v19.2(最新版本)使用Windows 8和jdk1.7 / 8.我使用了MS Excel 2007,2013等。您正在尝试使用最新版本/修复程序,请确保您使用的是最新版本/修复程序。您可以使用v19.2在简单的独立控制台Java程序/应用程序中对此进行测试。如果您发现问题,请粘贴示例代码(可以运行)并在此处发布以重现问题,我们会尽快检查。

请注意,Aspose.Cells不依赖于MS Office或使用自动化或其他库或API。 Aspose.Cells是用纯Java编写的,它没有任何依赖关系。