#c# #excel #datatable #spreadsheetgear
#c# #excel #datatable #spreadsheetgear
Вопрос:
Я пытаюсь это сделать:
IWorksheet worksheet = Factory.GetWorkbook().Worksheets[0];
IRange range = worksheet.Cells["A1"];
range.CopyFromDataTable(dataTable, SetDataFlags.None);
worksheet.Cells.Columns.AutoFit();
return worksheet;
Обычно это отлично работает, однако я столкнулся с проблемой. У меня есть один столбец с действительно длинным номером, возможно, с нулями спереди, и мне нужно, чтобы он был введен и отображен в виде текста. Если я выполняю поиск по этой конкретной ячейке, например:
var cell = range["U34"].Value;
Данные уже переведены в научную нотацию, поэтому никакое последующее форматирование не исправит их. Я попробовал SetDataFlags.AllText и это отлично работает, за исключением того, что это нарушает остальную часть листа, потому что все числа хранятся в виде текста, что неприемлемо.
Я в недоумении, как это исправить.
Решение: поскольку я просто хочу изменить один столбец, если он присутствует, и многие столбцы являются динамическими, я выбрал маршрут «предварительного форматирования». Найдите индекс столбца из datatable:
int ColumnIndex = -1;
for (int x = 0; x < dataTable.Columns.Count; x )
{
if (dataTable.Columns[x].ColumnName.Equals("Whatever"))
{
ColumnIndex = x;
}
}
worksheet.Cells[0, ColumnIndex, 0, ColumnIndex].EntireColumn.NumberFormat = "@";
Затем выполните CopyFromDataTable с флагами, установленными на None, и все идеально!
Ответ №1:
Диапазон.Метод CopyFromDataTable(…) может быть передан в SetDataFlags.Опция перечисления InsertCells, которая позволяет вам предварительно отформатировать диапазон назначения, чтобы вставленные данные, подлежащие обработке, соответствовали указанному вами форматированию. Это форматирование включает IRange ячейки.NumberFormat, который может быть установлен в «@» и указывает, что ввод в эту ячейку должен обрабатываться как текст.
Итак, если вы знаете, в каких столбцах будут эти необычно большие числа, которые запускают научную запись, другим вариантом было бы предварительно отформатировать диапазон назначения вашего листа с помощью IRange.NumberFormat = "@"
и сохранить ваши значения для этих столбцов как есть.
Пожалуйста, ознакомьтесь с документацией для IRange.Метод CopyFromDataTable(…), поскольку он предоставляет важную информацию о том, какой диапазон нуждается в этом «предварительном форматировании». Кроме того, предполагая, что вы установили SpreadsheetGear на свой компьютер, ознакомьтесь с примером Reporting > DataSet to Workbook в решениях SpreadsheetGear Explorer для C # / VB (находится в папке «SpreadsheetGear» в меню «Пуск») для демонстрации этого SetDataFlags.Опция InsertCells.
Комментарии:
1. Я пошел по пути предварительного форматирования, поскольку я думаю, что это намного проще для моей ситуации. Спасибо за вашу помощь! Потрясающий продукт!