如何将图形添加到通过 TMS Flexcel 生成的 Excel 文件?

How to add graph to Excel file generated via TMS Flexcel?

我有一个 xlsx 文件用作 TMS Flexcel 的模板。我用数据填充它,它呈现得很好 table。到目前为止一切都很好。 问题是当我想添加图表时。

生成的 xlsx 文件似乎已损坏,Excel 在我打开它时试图恢复它。不幸的是它失败了,所以生成的文件没有图表。

有人遇到过吗?如何解决?

我得到的错误信息是这样的

 Excel completed file level validation and repair. 
 Some parts of this workbook may have been repaired or discarded.
 Removed Part: Drawing shape.

Link 至 Flexcel 网站:http://www.tmssoftware.com/site/default.asp

我们取得一些成功的原因是: 1. 将一些虚拟数据添加到将存储实际数据的 table 中。 1. 从虚拟数据创建一个图表并按照您想要的方式对其进行格式化。

当数据导出到 Excel 时,它将替换虚拟数据并出现在图表中。

TMS 对 xlsx 文件的支持也非常有限。尝试改用 xls 文件。

大卫·沃尔特鲁贝克。我们有一个类似的问题,我们想在同一个 sheet 中绘制 2 tables 的图形,一个在另一个下面。 Flexcel 不支持动态绘制图形,因为它没有 属性 来设置图形的范围。我所做的是 1.在XLSX文件中写入table并保存。 2. 使用使用 Open XML SDK 的第 3 方库(MIT 许可证)打开它并指定要绘制的图形的范围和类型。

这样我也可以在动态 table 上生成图表。

下面是我使用 SpreadSheetLight 库的代码摘录。 List<DrawExcelChart.DynamicExcelChart> 是用于保存 startRange 的通用列表,GetColumnAlphabetAndNumber 是将 Column/Rows 转换为 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;
    }
}