Как добавить график в файл Excel, созданный с помощью TMS Flexcel?

У меня есть файл 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


person David Votrubec    schedule 01.07.2015    source источник


Ответы (2)


Что мы делаем с некоторым успехом: 1. Добавляем фиктивные данные в таблицу, где будут храниться ваши фактические данные. 1. Создайте график из фиктивных данных и отформатируйте его так, как хотите.

Когда данные будут экспортированы в Excel, они заменят фиктивные данные и появятся на графике.

TMS также имеет очень ограниченную поддержку файлов xlsx. Вместо этого попробуйте использовать файл xls.

person GrizzlyManBear    schedule 07.08.2015
comment
Спасибо, я попробую - person David Votrubec; 09.08.2015
comment
Я приму это как правильный ответ, поскольку можно создать график в .xls (а не в xlsx). Мой график немного сложен, а данные слишком динамичны. Поэтому я вместо этого сгенерирую график как изображение, а затем вставлю его в Excel. Как здесь stackoverflow.com/questions/1823884/ - person David Votrubec; 12.08.2015

Дэвид Вольтрубек. У нас была аналогичная проблема, когда мы хотели нарисовать график для двух таблиц на одном листе, одну под другой. Flexcel не поддерживает динамическое рисование графиков, так как не имеет свойства устанавливать диапазон для графика. Я сделал следующее: 1. Записал таблицу в файл XLSX и сохранил. 2. Откройте его с помощью сторонней библиотеки (лицензия MIT), которая использует Open XML SDK, и укажите диапазон и тип графика, который нужно нарисовать.

Таким образом, я мог также создавать графики для динамических таблиц.

Ниже приведен фрагмент кода, в котором я использовал библиотеку 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;
    }
}
person CodeTantric    schedule 09.09.2015