C# 如何将图形添加到通过TMS Flexcel生成的Excel文件中?
我有一个xlsx文件作为TMS Flexcel的模板。我用数据填充它,它将它呈现在一个漂亮的表中。到目前为止一切都很好。 问题是当我想添加一个图表时 生成的xlsx文件似乎已损坏,当我打开它时,Excel会尝试将其恢复。不幸的是,它失败了,因此生成的文件没有图形 有人遇到过吗?如何解决这个问题 我得到的错误信息是C# 如何将图形添加到通过TMS Flexcel生成的Excel文件中?,c#,excel,tms,flexcel,C#,Excel,Tms,Flexcel,我有一个xlsx文件作为TMS Flexcel的模板。我用数据填充它,它将它呈现在一个漂亮的表中。到目前为止一切都很好。 问题是当我想添加一个图表时 生成的xlsx文件似乎已损坏,当我打开它时,Excel会尝试将其恢复。不幸的是,它失败了,因此生成的文件没有图形 有人遇到过吗?如何解决这个问题 我得到的错误信息是 Excel completed file level validation and repair. Some parts of this workbook may have be
Excel completed file level validation and repair.
Some parts of this workbook may have been repaired or discarded.
Removed Part: Drawing shape.
链接到Flexcel网站:我们取得一些成功的做法是: 1.向将存储实际数据的表中添加一些虚拟数据。 1.从虚拟数据创建一个图形,并按照您想要的方式对其进行格式化 当数据导出到Excel时,它将替换虚拟数据并显示在图形中
TMS对xlsx文件的支持也非常有限。尝试改用xls文件。David Voltrubec。我们有一个类似的问题,我们想在同一张纸上画两张表的图形,一张在另一张下面。Flexcel不支持动态绘制图形,因为它没有设置图形范围的属性。我所做的是 1.将表格写入XLSX文件并保存。 2.使用使用OpenXMLSDK的第三方库(MIT许可证)打开它,并指定要绘制的图形的范围和类型 这样,我也可以在动态表上生成图形 下面是我使用库的代码摘录。
List
是用于保存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;
}
}
private void Drawchart InCelUsing SpreadsheetLight(字符串AstFileName、字符串AstFilePath、输出字符串AstAlteredFileName)
{
列出实际CellStartEndRanges;
string finalFilePath=string.Empty;
int工作表计数=0;
string newFilePath=string.Empty;
双图表位置开始=0;
双图表位置ND=0;
string endPointAlphabet=string.Empty;
string endPointNumber=string.Empty;
string startPointAlphabet=string.Empty;
string startPointNumber=string.Empty;
DrawExcelChart myExcelChartObject=新的DrawExcelChart();
SLChart SSLChartObject=null;
SLDocument SSLDocumentObject=null;
尝试
{
DecillCellStartRanges(超出实际CellStartRanges);
finalFilePath=AstFilePath+“\\”+AstFileName;
newFilePath=AstFilePath+“\\”+AstFileName.Replace(“haschart”,”);
使用(SSLDocumentObject=新SLDocument(finalFilePath))
{
WorksheetCount=SSLDocumentObject.GetSheetNames().Count;
对于(int workSheetCount=0;workSheetCount
谢谢,我会尝试一下,我会接受它作为有效答案,因为它可以在.xls(而不是xlsx)中生成图形。我的图表有点复杂,数据太动态了。因此,我将生成图形作为图像,然后插入excel。像这里