Почему мое значение "определенного имени" (диапазона) не устанавливается с помощью кода Ligh t Spreadsheet Light?
У меня есть этот код, чтобы применить "заголовок" (большой, верхний из "заголовок") к листу:
// Initialize
private static SLDocument sl;
. . .
sl = new SLDocument();
// Create a Style
SLStyle styleHeading = sl.CreateStyle();
styleHeading.SetFont(FontSchemeValues.Major, 36);
styleHeading.Font.Italic = true;
styleHeading.Font.FontName = "Candara";
// Create a Defined Name (Range) and give it a value and style
sl.SetDefinedName("UnitName", "Sheet1!$A$1:$A$13");
sl.SetCellValue("UnitName", "Pennsylvania Platypi Presumptuously Parasailing");
sl.SetCellStyle("UnitName", styleHeading);
// Save the sheet
string appDataFolder = HttpContext.Current.Server.MapPath("~/App_Data/");
string spreadsheetLightFilename = "PlatypiTest.xlsx";
string fullspreadsheetLightPath = Path.Combine(appDataFolder, spreadsheetLightFilename);
sl.SaveAs(fullspreadsheetLightPath);
Примечание: я подтвердил, что "Sheet1" был прав с этим кодом:
var nameList = sl.GetSheetNames();
string s = nameList[0]; // "s" is "Sheet1"
Файл создан и сохранен, но в нем нет содержимого; когда я открываю его, ячейка A1 выделяется, но не содержит содержимого.
Я пропускаю жизненно важный шаг или поступаю совершенно неправильно?
2 ответа
То, что вы делаете, логично хорошо.
Эта линия
sl.SetDefinedName("UnitName", "Sheet1!$A$1:$A$13");
действительно создает именованный диапазон. Вы можете увидеть это, если откроете полученный файл в Excel и посмотрите на селектор ячеек:
или менеджер имен:
Проблема заключается в том, что Spreadsheet Light имеет очень простую поддержку для Определенных имен - в основном, все, что вы можете сделать, - это создать имя и использовать его внутри формул. Все методы, которые манипулируют контентом, ожидают ссылки на одну ячейку. Кстати, все эти методы не выдают исключение, если вы не передаете действительную ссылку на ячейку, а возвращаете bool
указывая на успех / неудачу.
Например, если вы измените свой код на
bool success1 = sl.SetCellValue("UnitName", "Pennsylvania Platypi Presumptuously Parasailing");
bool success2 = sl.SetCellStyle("UnitName", styleHeading);
вы увидите, что оба success
переменные false
,
Вкратце, если вы хотите перенести некоторый контент в файл Excel, вы должны делать это по ячейкам. Он даже не поддерживает регулярные (безымянные) диапазоны.
Теоретически, по крайней мере, вы могли бы сделать это так:
// from http://stackru.com/questions/36481802/what-is-the-analogue-to-excel-interops-worksheet-usedrange-rows-in-spreadsheet
var stats = sl.GetWorksheetStatistics();
var rowcount = stats.NumberOfRows;
SLStyle entireSheetRangeStyle = sl.CreateStyle();
entireSheetRangeStyle.// (set style vals)
. . .
sl.SetRowStyle(1, rowcount, entireSheetRangeStyle);