Praca z zarządzaniem arkuszami kalkulacyjnymi
Praca z zarządzaniem arkuszami kalkulacyjnymi
Klasa Workbook jest obiektem głównym dla wszystkich operacji na arkuszach kalkulacyjnych w Aspose.Cells FOSS dla .NET. Zapewnia dostęp do WorksheetCollection, zdefiniowanych nazw oraz cyklu życia zapisu/odczytu. Ten przewodnik obejmuje ładowanie odporne na błędy, organizację arkuszy, konfigurację układu wydruku oraz kontrolę układu wierszy/kolumn/komórek.
Ładowanie skoroszytów z opcjami naprawy
Przekaż ścieżkę do pliku do konstruktora Workbook, aby wczytać istniejący plik XLSX. Dostarcz obiekt LoadOptions z TryRepairPackage i TryRepairXml ustawionymi na true, aby spróbować odzyskać pliki z drobną korupcją strukturalną. WorkbookLoadException jest rzucany, gdy plik jest nieodwracalny.
using Aspose.Cells_FOSS;
var options = new LoadOptions
{
TryRepairPackage = true,
TryRepairXml = true,
};
try
{
var wb = new Workbook("data.xlsx", options);
Console.WriteLine("Sheets: " + wb.Worksheets.Count);
Console.WriteLine("Cell A1: " + wb.Worksheets[0].Cells["A1"].StringValue);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Unrecoverable: " + ex.Message);
}Dodawanie i organizowanie arkuszy
Workbook.Worksheets zwraca WorksheetCollection. Wywołaj Add(name), aby dodać nowy arkusz o podanej nazwie; metoda zwraca indeks nowego arkusza. Uzyskaj dostęp do arkuszy przez indeks zerowy lub przez nazwę. Ustaw WorksheetCollection.ActiveSheetName, aby kontrolować, która karta jest aktywna po otwarciu pliku.
using Aspose.Cells_FOSS;
var wb = new Workbook();
// Rename the default sheet
wb.Worksheets[0].Name = "Summary";
// Add sheets
var dataIdx = wb.Worksheets.Add("Data");
var archiveIdx = wb.Worksheets.Add("Archive");
// Set active sheet
wb.Worksheets.ActiveSheetName = "Data";
// Write to sheets by name
wb.Worksheets["Summary"].Cells["A1"].PutValue("Overview total");
wb.Worksheets["Data"].Cells["A1"].PutValue("Raw rows start here");
wb.Save("organised.xlsx");
// Verify
var loaded = new Workbook("organised.xlsx");
Console.WriteLine("Active: " + loaded.Worksheets.ActiveSheetName);
Console.WriteLine("Sheet count: " + loaded.Worksheets.Count);Ukrywanie i wyświetlanie arkuszy
Ustaw Worksheet.VisibilityType na VisibilityType.Hidden, aby ukryć arkusz bez jego usuwania. Ukryte arkusze są zachowane w pliku XLSX i można je ponownie wyświetlić, ustawiając VisibilityType.Visible. Kolor zakładki jest ustawiany za pomocą Worksheet.TabColor.
using Aspose.Cells_FOSS;
var wb = new Workbook();
wb.Worksheets[0].Name = "Visible";
var hiddenIdx = wb.Worksheets.Add("Internal");
var hiddenSheet = wb.Worksheets[hiddenIdx];
hiddenSheet.VisibilityType = VisibilityType.Hidden;
hiddenSheet.Cells["A1"].PutValue("Internal data");
wb.Worksheets["Visible"].TabColor = Color.FromArgb(255, 70, 130, 180);
wb.Save("hidden.xlsx");Konfigurowanie ustawień strony
Worksheet.PageSetup udostępnia wszystkie właściwości związane z drukowaniem. Użyj PageOrientationType, aby przełączać się między orientacją pionową a poziomą. Użyj PaperSizeType, aby wybrać rozmiar papieru. Zdefiniuj obszar wydruku przy pomocy PrintArea, ustaw powtarzające się wiersze/kolumny przy pomocy PrintTitleRows/PrintTitleColumns oraz dodaj ręczne podziały stron przy pomocy AddHorizontalPageBreak i AddVerticalPageBreak.
using Aspose.Cells_FOSS;
var wb = new Workbook();
var ws = wb.Worksheets[0];
// Sample data
for (var r = 0; r < 60; r++)
ws.Cells[r, 0].PutValue("Row " + (r + 1));
var ps = ws.PageSetup;
ps.Orientation = PageOrientationType.Landscape;
ps.PaperSize = PaperSizeType.PaperA4;
ps.LeftMarginInch = 0.5d;
ps.RightMarginInch = 0.5d;
ps.TopMarginInch = 0.75d;
ps.BottomMarginInch = 0.75d;
ps.PrintArea = "$A$1:$H$60";
ps.PrintTitleRows = "$1:$1";
ps.CenterHeader = "Sales Report";
ps.LeftFooter = "Confidential";
ps.RightFooter = "Page &P of &N";
ps.PrintGridlines = true;
ps.CenterHorizontally = true;
ps.AddHorizontalPageBreak(30);
wb.Save("paged.xlsx");
var loaded = new Workbook("paged.xlsx");
Console.WriteLine("Orientation: " + loaded.Worksheets[0].PageSetup.Orientation);
Console.WriteLine("Print area: " + loaded.Worksheets[0].PageSetup.PrintArea);Rozmiarowanie wierszy i kolumn
Uzyskaj dostęp do Worksheet.Cells.Rows przez indeks, aby otrzymać obiekt Row. Ustaw Row.Height (w punktach), aby kontrolować wysokość wiersza. Ustaw Row.IsHidden na true, aby ukryć wiersz. Uzyskaj dostęp do Worksheet.Cells.Columns przez indeks, aby otrzymać obiekt Column. Ustaw Column.Width (w jednostkach znakowych) oraz Column.IsHidden.
using Aspose.Cells_FOSS;
var wb = new Workbook();
var ws = wb.Worksheets[0];
// Populate data
for (var r = 0; r < 5; r++)
for (var c = 0; c < 4; c++)
ws.Cells[r, c].PutValue($"R{r + 1}C{c + 1}");
// Row height and visibility
ws.Cells.Rows[0].Height = 28d; // Header taller
ws.Cells.Rows[3].IsHidden = true; // Hide row 4
// Column width and visibility
ws.Cells.Columns[0].Width = 22d;
ws.Cells.Columns[3].IsHidden = true;
wb.Save("layout.xlsx");
var loaded = new Workbook("layout.xlsx");
Console.WriteLine("Row 0 height: " + loaded.Worksheets[0].Cells.Rows[0].Height);
Console.WriteLine("Col 0 width: " + loaded.Worksheets[0].Cells.Columns[0].Width);Scalanie komórek
Wywołaj Worksheet.Cells.Merge(firstRow, firstColumn, totalRows, totalColumns), aby scalić spójny prostokątny blok w jedną komórkę. Scalona komórka dziedziczy wartość komórki w lewym górnym rogu. Użyj Worksheet.Cells.MergedCells, aby odczytać wszystkie scalone obszary w załadowanym skoroszycie.
using Aspose.Cells_FOSS;
var wb = new Workbook();
var ws = wb.Worksheets[0];
// Title spanning A1:D1
ws.Cells["A1"].PutValue("Quarterly Sales Report");
ws.Cells.Merge(0, 0, 1, 4);
// Section header spanning A3:D3
ws.Cells["A3"].PutValue("Region: North");
ws.Cells.Merge(2, 0, 1, 4);
// Column headers
ws.Cells["A4"].PutValue("Product"); ws.Cells["B4"].PutValue("Q1");
ws.Cells["C4"].PutValue("Q2"); ws.Cells["D4"].PutValue("Q3");
wb.Save("report.xlsx");
var loaded = new Workbook("report.xlsx");
Console.WriteLine("Merged regions: " + loaded.Worksheets[0].Cells.MergedCells.Count);Wskazówki i najlepsze praktyki
- Użyj
WorksheetCollection.ActiveSheetName, aby zapewnić, że właściwa karta zostanie wybrana po otwarciu pliku w Excelu. - Ustaw marginesy strony w calach (
LeftMarginInch,TopMarginInch) — są to wartości zmiennoprzecinkowe, a nie całkowite. - Ukrywanie wierszy/kolumn (
IsHidden = true) zachowuje ich dane; usunięcie wiersza usuwa dane trwale. - Zawsze wywołuj
Workbook.Save()raz na końcu operacji wsadowej, a nie po każdej zmianie. - Łącz komórki oszczędnie w arkuszach danych — połączone obszary uniemożliwiają prawidłowe działanie sortowania i automatycznego filtrowania w całym połączonym obszarze.
Typowe problemy
| Problem | Przyczyna | Naprawa |
|---|---|---|
WorkbookLoadException przy ładowaniu | Uszkodzony ZIP lub XML w pliku XLSX | Ustaw LoadOptions.TryRepairPackage = true i TryRepairXml = true |
Add(name) zwraca nieprawidłowy indeks | Używanie nazwy arkusza jako indeksu | Add() zwraca indeks typu int; użyj tego indeksu, aby uzyskać dostęp do nowego arkusza |
| Wysokość wiersza nie jest zachowywana | Wysokość ustawiona na 0 lub wartość ujemną | Użyj dodatniej wartości typu double, takiej jak 28d |
| Połączona komórka wyświetla nieprawidłową wartość | Wartość zapisana w komórce nie będącej w lewym górnym rogu zakresu scalania | Zapisz wartość w lewą górną komórkę przed wywołaniem Cells.Merge() |
| Podział strony się nie pojawia | AddHorizontalPageBreak wywołane po Save() | Ustaw podziały stron przed wywołaniem Save() |
FAQ
Ile arkuszy mogę dodać?
Format XLSX obsługuje do 1024 arkuszy na skoroszyt. Praktyczne limity zależą od dostępnej pamięci i rozmiaru pliku.
Czy mogę skopiować arkusz między skoroszytami?
Obecny interfejs API nie udostępnia metody CopyTo do kopiowania arkuszy między skoroszytami. Wczytaj oba pliki i przenieś dane komórka po komórce.
Jak mogę zmienić kolejność arkuszy?
Użyj dostępu indeksowego WorksheetCollection i zmień nazwy arkuszy, aby zmienić ich logiczną kolejność. Bezpośrednie przemieszczenie pozycyjne nie jest dostępne w obecnym interfejsie API.
Jakie jednostki używa PageSetup dla marginesów?
Wszystkie właściwości marginesów (LeftMarginInch, TopMarginInch itp.) są podawane w calach jako wartości double.
Czy Cells.Merge zastępuje istniejące dane w komórce?
Wartość komórki w lewym górnym rogu jest zachowana; wartości w pozostałych połączonych komórkach są usuwane.
API Reference Podsumowanie
| Klasa / Metoda | Opis |
|---|---|
Workbook | Obiekt główny — tworzyć, ładować, zapisywać skoroszyty |
Workbook.Worksheets | Zwraca WorksheetCollection |
Workbook.Save(path) | Zachowaj skoroszyt w formacie XLSX |
WorksheetCollection.Add(name) | Dodaj nowy arkusz o nazwie |
WorksheetCollection.ActiveSheetName | Aktywna karta przy otwarciu pliku |
Worksheet.VisibilityType | VisibilityType.Hidden lub Visible |
Worksheet.TabColor | Kolor karty (Color) |
Worksheet.PageSetup | Ustawienia układu wydruku |
PageSetup.Orientation | PageOrientationType.Landscape or Portrait |
PageSetup.PaperSize | PaperSizeType.PaperA4, etc. |
PageSetup.AddHorizontalPageBreak(row) | Wstaw poziomy podział strony |
Cells.Rows[index].Height | Wysokość wiersza w punktach |
Cells.Rows[index].IsHidden | Ukryj/pokaż wiersz |
Cells.Columns[index].Width | Szerokość kolumny w jednostkach znakowych |
Cells.Columns[index].IsHidden | Ukryj/pokaż kolumnę |
Cells.Merge(row, col, numRows, numCols) | Scal prostokątny blok |
Cells.MergedCells | Lista scalonych obszarów w arkuszu |
LoadOptions.TryRepairPackage | Podejmij próbę naprawy ZIP przy ładowaniu |
LoadOptions.TryRepairXml | Podejmij próbę naprawy XML przy ładowaniu |
WorkbookLoadException | Rzucany, gdy plik jest nie do odzyskania |