大卫沃尔特鲁贝克。我们有一个类似的问题,我们想为同一张表中的 2 个表格绘制图表,一个在另一个之下。Flexcel 不支持动态绘制图形,因为它没有设置图形范围的属性。我所做的是 1. 将表格写入 XLSX 文件并保存。2. 使用使用 Open XML SDK 的第 3 方库(MIT 许可)打开它,并指定要绘制的图形的范围和类型。
这样我也可以在动态表上生成图表。
下面是我使用SpreadSheetLight库的代码摘录。
List<DrawExcelChart.DynamicExcelChart>
是保存 startRange 的通用列表,GetColumnAlphabetAndNumber
用于将列/行转换为 Excel 字母数字单元格引用。
private void DrawChartInExcelUsingSpreadSheetLight(string astrFileName, string astrFilePath, out string astrAlteredFileName)
{
List<DrawExcelChart.DynamicExcelChart> ActualCellStartEndRanges;
string finalFilePath = string.Empty;
int WorkSheetsCount = 0;
string newFilePath = string.Empty;
double ChartYpositionStart = 0;
double ChartYpositionEnd = 0;
string endPointAlphabet = string.Empty;
string endPointNumber = string.Empty;
string startPointAlphabet = string.Empty;
string startPointNumber = string.Empty;
DrawExcelChart myExcelChartObject = new DrawExcelChart();
SLChart SSLChartObject = null;
SLDocument SSLDocumentObject = null;
try
{
DecideCellStartEndRanges(out ActualCellStartEndRanges);
finalFilePath = astrFilePath + "\\" + astrFileName;
newFilePath = astrFilePath + "\\" + astrFileName.Replace("haschart", "");
using (SSLDocumentObject = new SLDocument(finalFilePath))
{
WorkSheetsCount = SSLDocumentObject.GetSheetNames().Count;
for (int workSheetCount = 0; workSheetCount < WorkSheetsCount; workSheetCount++)
{
SSLDocumentObject.SelectWorksheet(SSLDocumentObject.GetSheetNames()[workSheetCount]);
myExcelChartObject.GetColumnAlphabetAndNumber(ActualCellStartEndRanges[workSheetCount].FirstChart.startRange, out startPointAlphabet, out startPointNumber);
myExcelChartObject.GetColumnAlphabetAndNumber(ActualCellStartEndRanges[workSheetCount].FirstChart.endRange, out endPointAlphabet, out endPointNumber);
ChartYpositionStart = Convert.ToInt32(endPointNumber) + 1;
ChartYpositionEnd = Convert.ToInt32(endPointNumber) + 2;
SSLDocumentObject.SetRowHeight(Convert.ToInt32(startPointNumber), Convert.ToInt32(endPointNumber) + 1, 15);
SSLChartObject = SSLDocumentObject.CreateChart(ActualCellStartEndRanges[workSheetCount].FirstChart.startRange, ActualCellStartEndRanges[workSheetCount].FirstChart.endRange);
SSLChartObject.SetChartType(SpreadsheetLight.Charts.SLLineChartType.LineWithMarkers);
SSLChartObject.SetChartPosition(ChartYpositionStart, 1, ChartYpositionEnd, 14);
SSLDocumentObject.SetRowHeight(Convert.ToInt32(ChartYpositionEnd), 180);
SSLChartObject.SetChartStyle(SpreadsheetLight.Charts.SLChartStyle.Style2);
SSLChartObject.Border.SetAutomaticColor();
SSLChartObject.Legend.LegendPosition = DocumentFormat.OpenXml.Drawing.Charts.LegendPositionValues.Right;
SSLDocumentObject.InsertChart(SSLChartObject);
}
SSLDocumentObject.SelectWorksheet(SSLDocumentObject.GetSheetNames()[0]);
SSLDocumentObject.SaveAs(newFilePath);
}
astrAlteredFileName = astrFileName.Replace("haschart", "");
}
catch (Exception obj_Except)
{
astrAlteredFileName = string.Empty;
}
finally
{
ActualCellStartEndRanges = null;
finalFilePath = string.Empty;
WorkSheetsCount = 0;
newFilePath = string.Empty;
ChartYpositionStart = 0;
ChartYpositionEnd = 0;
endPointAlphabet = string.Empty;
endPointNumber = string.Empty;
startPointAlphabet = string.Empty;
startPointNumber = string.Empty;
myExcelChartObject = null;
SSLChartObject = null;
SSLDocumentObject = null;
}
}