1

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

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

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

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

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

Flexcel 网站链接:http ://www.tmssoftware.com/site/default.asp

4

2 回答 2

1

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

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

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

于 2015-08-07T18:56:40.393 回答
0

大卫沃尔特鲁贝克。我们有一个类似的问题,我们想为同一张表中的 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;
    }
}
于 2015-09-09T12:17:35.740 回答