2016-03-30 13 views
2

ich diesen Code habe ein "Header" (große, top-of-the-Blatt "title") auf ein Blatt wenden:Warum wird mein Wert "definierter Name" (Bereich) nicht mit diesem Spreadsheet Light-Code festgelegt?

// 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); 

Anmerkung: Ich Nachweis erbracht, dass "Sheet1" war direkt mit dieser Code:

var nameList = sl.GetSheetNames(); 
string s = nameList[0]; // "s" is "Sheet1" 

Die Datei ist erstellt und gespeichert, aber es ist der Inhalt frei; Wenn ich es öffne, wird Zelle A1 hervorgehoben, ist aber inhaltsfrei.

Fehle ich einen wichtigen Schritt, oder geht das völlig falsch?

Antwort

1

Was machen Sie logisch?

Diese Linie

sl.SetDefinedName("UnitName", "Sheet1!$A$1:$A$13"); 

schafft in der Tat einen benannten Bereich. Sie können es sehen, wenn Sie die resultierende Datei in Excel öffnen und Blick auf die Zellenauswahl:

enter image description here

oder der Name Manager:

enter image description here

Das Problem ist aber, dass Tabellenkalkulations-Licht hat eine sehr einfache Unterstützung für definierte Namen - im Grunde können Sie nur einen Namen erstellen und ihn in den Formeln verwenden. Alle Methoden, die Inhalte manipulieren, erwarten eine Einzelzellenreferenz. Übrigens verursachen alle diese Methoden keine Ausnahme, wenn Sie keine gültige Zellenreferenz übergeben, sondern bool, die den Erfolg/Fehler angibt.

Zum Beispiel, wenn Sie Ihren Code zu

ändern
bool success1 = sl.SetCellValue("UnitName", "Pennsylvania Platypi Presumptuously Parasailing"); 
bool success2 = sl.SetCellStyle("UnitName", styleHeading); 

Sie werden sehen, dass beide success Variablen false sind.

Kurz, wenn Sie etwas Inhalt in die Excel-Datei bringen möchten, sollten Sie es Zelle für Zelle tun. Es unterstützt sogar keine regulären (unbenannten) Bereiche.

0

Theoretisch zumindest, könnte man es auf diese Weise tun:

// from http://stackoverflow.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);