Eksportuj Excel DataTable w C# | Konwersja danych Excel
Eksportowanie danych z Excela do DataTable zapewnia uporządkowany, pamięciowy dostęp do zawartości arkusza kalkulacyjnego, który naturalnie współpracuje z bazami danych, kontrolkami interfejsu użytkownika i zapytaniami LINQ. Odwrotny kierunek — zapisanie DataTable z powrotem do pliku Excel — jest równie ważny dla procesów generowania raportów i przechowywania danych. IronXL obsługuje oba kierunki w czystym środowisku .NET, bez zależności od pakietu Microsoft Office i bez konieczności konfiguracji interoperacyjności COM.
Zainstaluj IronXL przed uruchomieniem któregokolwiek z poniższych przykładów:
Install-Package IronXL
dotnet add package IronXL
Install-Package IronXL
dotnet add package IronXL
Po zainstalowaniu typy WorkBook i WorkSheet udostępniają metody ToDataTable i ToDataSet, które są bezpośrednio mapowane na struktury System.Data. Można również odwrócić ten proces, wpisując wartości DataRow z powrotem do arkusza i zapisując plik w formacie XLSX lub XLS.
Jak przekonwertować cały arkusz na tabelę danych?
Metoda ToDataTable konwertuje cały arkusz — lub nazwany zakres — na System.Data.DataTable. Przekaż true, aby potraktować pierwszy wiersz jako nagłówki kolumn, dzięki czemu nazwy kolumn w wynikowej tabeli będą dokładnie odpowiadać nagłówkom arkusza kalkulacyjnego.
using IronXL;
using System.Data;
// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");
// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);
// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
Console.Write(row[i] + "\t");
}
Console.WriteLine();
}
using IronXL;
using System.Data;
// Load the workbook from disk
WorkBook workbook = WorkBook.Load("customers.xlsx");
// Grab the default (first) worksheet
WorkSheet worksheet = workbook.DefaultWorkSheet;
// Convert the entire sheet; first row becomes column headers
DataTable dataTable = worksheet.ToDataTable(true);
// Iterate every row and print each cell value
foreach (DataRow row in dataTable.Rows)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
Console.Write(row[i] + "\t");
}
Console.WriteLine();
}
Imports IronXL
Imports System.Data
' Load the workbook from disk
Dim workbook As WorkBook = WorkBook.Load("customers.xlsx")
' Grab the default (first) worksheet
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
' Convert the entire sheet; first row becomes column headers
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Iterate every row and print each cell value
For Each row As DataRow In dataTable.Rows
For i As Integer = 0 To dataTable.Columns.Count - 1
Console.Write(row(i) & vbTab)
Next
Console.WriteLine()
Next
Co robi ten kod
WorkBook.Load odczytuje plik XLSX bez żadnej automatyzacji pakietu Office. worksheet.ToDataTable(true) iteruje każdą komórkę w arkuszu i mapuje ją do DataRow, używając pierwszego wiersza jako nazw DataColumn. Wynikowy DataTable jest standardowym obiektem System.Data — można go powiązać z DataGridView, przekazać do SqlBulkCopy lub natychmiast wykonać na nim zapytania LINQ.
Wywołanie ToDataTable obsługuje zarówno formaty XLS, jak i XLSX, więc ten sam kod działa w starszych arkuszach kalkulacyjnych bez konieczności modyfikacji. Pełny opis API znajduje się w dokumentacji IronXL DataTable i DataSet.
Jak wyeksportować określony zakres komórek do tabeli danych?
Gdy arkusz zawiera wiele obszarów danych lub gdy potrzebny jest tylko podzbiór wierszy i kolumn, można wyeksportować określony zakres komórek zamiast całego arkusza. Takie podejście jest bardziej wydajne w przypadku dużych plików, ponieważ IronXL przetwarza tylko wybrane komórki.
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");
// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("financial_report.xlsx");
// Access a named worksheet
WorkSheet worksheet = workbook.GetWorkSheet("Summary");
// Select only the region A1:D20 and convert it
DataTable dt = worksheet["A1:D20"].ToDataTable(true);
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}");
foreach (DataRow row in dt.Rows)
{
foreach (var item in row.ItemArray)
{
Console.Write(item + "\t");
}
Console.WriteLine();
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("financial_report.xlsx")
' Access a named worksheet
Dim worksheet As WorkSheet = workbook.GetWorkSheet("Summary")
' Select only the region A1:D20 and convert it
Dim dt As DataTable = worksheet("A1:D20").ToDataTable(True)
Console.WriteLine($"Rows: {dt.Rows.Count}, Columns: {dt.Columns.Count}")
For Each row As DataRow In dt.Rows
For Each item In row.ItemArray
Console.Write(item & vbTab)
Next
Console.WriteLine()
Next
Dłączego wybór zakresu ma znaczenie
Składnia nawiasów worksheet["A1:D20"] zwraca obiekt IronXl.Range. Wywołanie funkcji ToDataTable w tym zakresie ogranicza przetwarzanie dokładnie do tych komórek, co oznacza szybsze wykonanie i mniejsze zużycie pamięci, gdy plik źródłowy zawiera dziesiątki tysięcy wierszy.
Można również określić nazwane zakresy lub dynamicznie tworzyć ciąg zakresu w czasie wykonywania — na przykład $"A1:D{lastRow}" — co sprawia, że podejście to jest elastyczne w przypadku eksportu danych o zmiennej długości. Dokumentacja API klasy Range zawiera wszystkie dostępne metody wyboru i zapytań.
Jak przekonwertować skoroszyt wielarkuszowy na zestaw danych?
Zeszyty robocze z wieloma arkuszami są naturalnie mapowane na System.Data.DataSet, gdzie każdy arkusz staje się oddzielnym DataTable. Metoda ToDataSet wykonuje tę konwersję w jednym wywołaniu.
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");
// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine($"Sheet: {table.TableName}");
Console.WriteLine($"Rows: {table.Rows.Count}");
Console.WriteLine();
}
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("multi_sheet.xlsx");
// Each worksheet becomes a DataTable inside the DataSet
DataSet dataSet = workbook.ToDataSet();
foreach (DataTable table in dataSet.Tables)
{
Console.WriteLine($"Sheet: {table.TableName}");
Console.WriteLine($"Rows: {table.Rows.Count}");
Console.WriteLine();
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("multi_sheet.xlsx")
' Each worksheet becomes a DataTable inside the DataSet
Dim dataSet As DataSet = workbook.ToDataSet()
For Each table As DataTable In dataSet.Tables
Console.WriteLine($"Sheet: {table.TableName}")
Console.WriteLine($"Rows: {table.Rows.Count}")
Console.WriteLine()
Next
Dostęp do arkuszy według nazwy
Każdy element DataTable w zwróconym DataSet wykorzystuje oryginalną nazwę arkusza jako swoją właściwość TableName, dzięki czemu można pobrać konkretny arkusz za pomocą dataSet.Tables["Summary"] zamiast iterować kolekcję. Ułatwia to tworzenie logiki raportowania obejmującej wiele arkuszy lub łączenie danych z kilku arkuszy przed zapisaniem wyników w bazie danych.
Aby dowiedzieć się więcej o pracy z wieloma arkuszami i poruszaniu się po strukturze skoroszytu, zobacz, jak otwierać arkusze programu Excel i zarządzać nimi.
Jak wyeksportować tabelę danych z powrotem do pliku Excel?
Kierunek importu do DataTable to tylko połowa sukcesu. Gdy trzeba zapisać dane strukturalne z powrotem w arkuszu kalkulacyjnym — na potrzeby raportów, pobrań lub archiwizacji — należy utworzyć nowy skoroszyt, wypełnić komórki z DataTable i zapisać.
using IronXL;
using System.Data;
// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);
// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
}
}
// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");
using IronXL;
using System.Data;
// Build a sample DataTable
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("ProductID", typeof(int)));
dt.Columns.Add(new DataColumn("ProductName", typeof(string)));
dt.Columns.Add(new DataColumn("UnitPrice", typeof(decimal)));
dt.Rows.Add(1, "Widget Pro", 29.99m);
dt.Rows.Add(2, "Gadget Max", 49.99m);
dt.Rows.Add(3, "Sensor Kit", 14.50m);
// Create a new workbook and worksheet
WorkBook workbook = WorkBook.Create();
WorkSheet worksheet = workbook.CreateWorkSheet("Products");
// Write column headers from DataTable.Columns
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(0, col, dt.Columns[col].ColumnName);
}
// Write data rows
for (int row = 0; row < dt.Rows.Count; row++)
{
for (int col = 0; col < dt.Columns.Count; col++)
{
worksheet.SetCellValue(row + 1, col, dt.Rows[row][col]);
}
}
// Save as XLSX
workbook.SaveAs("products_export.xlsx");
Console.WriteLine("Export complete.");
Imports IronXL
Imports System.Data
' Build a sample DataTable
Dim dt As New DataTable()
dt.Columns.Add(New DataColumn("ProductID", GetType(Integer)))
dt.Columns.Add(New DataColumn("ProductName", GetType(String)))
dt.Columns.Add(New DataColumn("UnitPrice", GetType(Decimal)))
dt.Rows.Add(1, "Widget Pro", 29.99D)
dt.Rows.Add(2, "Gadget Max", 49.99D)
dt.Rows.Add(3, "Sensor Kit", 14.50D)
' Create a new workbook and worksheet
Dim workbook As WorkBook = WorkBook.Create()
Dim worksheet As WorkSheet = workbook.CreateWorkSheet("Products")
' Write column headers from DataTable.Columns
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(0, col, dt.Columns(col).ColumnName)
Next
' Write data rows
For row As Integer = 0 To dt.Rows.Count - 1
For col As Integer = 0 To dt.Columns.Count - 1
worksheet.SetCellValue(row + 1, col, dt.Rows(row)(col))
Next
Next
' Save as XLSX
workbook.SaveAs("products_export.xlsx")
Console.WriteLine("Export complete.")
Jak działa pętla zapisywania komórek
SetCellValue(rowIndex, columnIndex, value) akceptuje wartości object, więc przekazujesz nazwy kolumn dla wiersza nagłówkowego oraz surowe wartości komórek dla wierszy danych bez żadnej konwersji typów. Przesunięcie wiersza row + 1 rezerwuje wiersz 0 dla nagłówków. Powstały plik XLSX jest w pełni poprawnym arkuszem kalkulacyjnym — bez symboli zastępczych i plików tymczasowych.
W przypadku większych tabel danych warto rozważyć zastosowanie automatycznego dostosowywania rozmiaru kolumn po zapisaniu danych, aby treść wyświetlała się przejrzyście bez konieczności ręcznego formatowania.
Jak powiązać DataTable z DataGridView?
Jednym z najczęstszych powodów eksportowania arkusza Excel do DataTable jest wyświetlenie go w oknie Windows Forms DataGridView. Gdy już masz DataTable, powiązanie to tylko jedna linijka kodu.
using IronXL;
using System.Data;
using System.Windows.Forms;
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);
// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;
using IronXL;
using System.Data;
using System.Windows.Forms;
WorkBook workbook = WorkBook.Load("inventory.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
DataTable dataTable = worksheet.ToDataTable(true);
// Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable;
Imports IronXL
Imports System.Data
Imports System.Windows.Forms
Dim workbook As WorkBook = WorkBook.Load("inventory.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim dataTable As DataTable = worksheet.ToDataTable(True)
' Bind directly to a DataGridView
dataGridViewInventory.DataSource = dataTable
Co dzieje się w momencie wiązania
Ustawienie DataSource powoduje, że DataGridView odczytuje nazwy kolumn i dane wierszy z DataTable. Każdy DataColumn staje się kolumną tabeli, a każdy DataRow staje się widocznym wierszem. Możesz stosować sortowanie, filtrowanie i wybieranie za pomocą wbudowanych elementów sterujących siatki bez konieczności pisania dodatkowego kodu.
Ten wzorzec działa równie dobrze z WPF DataGrid, ASP.NET GridView i każdą inną infrastrukturą powiązania danych .NET. Aby uzyskać przewodnik krok po kroku, zobacz, jak wyeksportować DataGridView do Excela w odwrotnym kierunku.
Jak korzystać z zapytań LINQ w wyeksportowanej tabeli danych?
Po przekonwertowaniu arkusza na DataTable można uruchamiać zapytania LINQ przy użyciu metody rozszerzenia AsEnumerable(), która przekształca każdy DataRow w element, na którym można wykonywać zapytania.
using IronXL;
using System.Data;
using System.Linq;
WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);
// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
.Where(row => row.Field<double>("Revenue") > 10000)
.OrderByDescending(row => row.Field<double>("Revenue"))
.ToList();
Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}
using IronXL;
using System.Data;
using System.Linq;
WorkBook workbook = WorkBook.Load("sales.xlsx");
DataTable dt = workbook.DefaultWorkSheet.ToDataTable(true);
// Filter rows where the "Revenue" column exceeds 10000
var highRevenue = dt.AsEnumerable()
.Where(row => row.Field<double>("Revenue") > 10000)
.OrderByDescending(row => row.Field<double>("Revenue"))
.ToList();
Console.WriteLine($"High-revenue records: {highRevenue.Count}");
foreach (var row in highRevenue)
{
Console.WriteLine($"{row["Product"]}: {row["Revenue"]:C}");
}
Imports IronXL
Imports System.Data
Imports System.Linq
Dim workbook As WorkBook = WorkBook.Load("sales.xlsx")
Dim dt As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
' Filter rows where the "Revenue" column exceeds 10000
Dim highRevenue = dt.AsEnumerable() _
.Where(Function(row) row.Field(Of Double)("Revenue") > 10000) _
.OrderByDescending(Function(row) row.Field(Of Double)("Revenue")) _
.ToList()
Console.WriteLine($"High-revenue records: {highRevenue.Count}")
For Each row In highRevenue
Console.WriteLine($"{row("Product")}: {row("Revenue"):C}")
Next
Dłączego LINQ w DataTable jest przydatne
Zapytania LINQ zapewniają czytelny, silnie typowany sposób filtrowania, sortowania, grupowania i wyświetlania danych z przekonwertowanego arkusza. row.Field<t>(columnName) obsługuje wymuszanie typów w przejrzysty sposób, wyrzucając wyjątek InvalidCastException, jeśli wartość nie może zostać przekonwertowana, zamiast zwracać cichą wartość null. Ułatwia to wczesne wykrywanie problemów z jakością danych.
Połącz to podejście z eksportem opartym na zakresach, o którym mowa w poprzedniej sekcji, aby wyszukiwać konkretne obszary arkusza zamiast całych arkuszy, co pozwala ograniczyć zużycie pamięci w przypadku dużych plików.
Jak radzisz sobie z komórkami o wartości null i pustymi komórkami podczas eksportu?
Arkusze kalkulacyjne Excel często zawierają luki — puste komórki, scalone obszary lub tekst zastępczy. IronXL mapuje puste komórki na DBNull.Value w eksportowanym DataTable, co odpowiada standardowemu zachowaniu ADO.NET, dzięki czemu istniejący kod obsługi wartości null działa bez modyfikacji.
| Stan komórki w Excelu | Wartość DataTable | Uwagi |
|---|---|---|
| Wartość tekstu | Ciąg znaków | Zwrócono bez zmian |
| Wartość liczbowa | Podwójna lub dziesiętna | Zależy od formatu komórki |
| Wartość daty | Data i godzina | Przetworzone z numeru seryjnego |
| Wartość logiczna | Boolean | PRAWDA/FAŁSZ w Excelu |
| Pusta komórka | DBNull.Value | Standardowa wartość null w ADO.NET |
| Komórka formuły | Wynik obliczeń | IronXL najpierw ocenia formułę |
Podczas zapisywania DataTable z powrotem do Excela, pola DBNull.Value tworzą puste komórki, zachowując wierność danych w obie strony. Jeśli potrzebujesz domyślnego ciągu znaków dla pól o wartości null, zastąp DBNull.Value swoim symbolem zastępczym przed wywołaniem SetCellValue.
Więcej wskazówek dotyczących przygotowywania danych można znaleźć w dokumentacji klasy DataTable firmy Microsoft, która szczegółowo omawia obsługę wartości null, zarządzanie ograniczeniami oraz stany wierszy.
Jak oszczędzać pamięć podczas eksportowania dużych arkuszy?
W przypadku arkuszy zawierających wiele tysięcy wierszy eksportowanie całego arkusza naraz powoduje jednoczesne przydzielenie wszystkich danych w pamięci. Dwa wzorce IronXL zmniejszają szczytowe zużycie pamięci:
- Eksport zakresu: Użyj
worksheet["A1:D5000"].ToDataTable(true), aby przetworzyć ograniczony obszar zamiast całego arkusza. - Przetwarzanie wsadowe: Oblicz ostatnio używany wiersz za pomocą
worksheet.RowCount, a następnie przejdź przez zakresy o stałym rozmiarze — na przykład 1000 wierszy na raz — i przetwarzaj każdą partię przed przejściem do następnej.
Właściwości worksheet.RowCount i worksheet.ColumnCount pozwalają tworzyć dynamiczne ciągi znaków zakresu bez konieczności sztywnego kodowania wymiarów:
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
int batchSize = 1000;
int totalRows = worksheet.RowCount;
for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
int endRow = Math.Min(startRow + batchSize - 1, totalRows);
string rangeAddress = $"A{startRow}:Z{endRow}";
DataTable batch = worksheet[rangeAddress].ToDataTable(false);
// Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}");
}
using IronXL;
using System.Data;
WorkBook workbook = WorkBook.Load("large_dataset.xlsx");
WorkSheet worksheet = workbook.DefaultWorkSheet;
int batchSize = 1000;
int totalRows = worksheet.RowCount;
for (int startRow = 1; startRow <= totalRows; startRow += batchSize)
{
int endRow = Math.Min(startRow + batchSize - 1, totalRows);
string rangeAddress = $"A{startRow}:Z{endRow}";
DataTable batch = worksheet[rangeAddress].ToDataTable(false);
// Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}");
}
Imports IronXL
Imports System.Data
Dim workbook As WorkBook = WorkBook.Load("large_dataset.xlsx")
Dim worksheet As WorkSheet = workbook.DefaultWorkSheet
Dim batchSize As Integer = 1000
Dim totalRows As Integer = worksheet.RowCount
For startRow As Integer = 1 To totalRows Step batchSize
Dim endRow As Integer = Math.Min(startRow + batchSize - 1, totalRows)
Dim rangeAddress As String = $"A{startRow}:Z{endRow}"
Dim batch As DataTable = worksheet(rangeAddress).ToDataTable(False)
' Process each batch -- write to database, transform, etc.
Console.WriteLine($"Processed rows {startRow} to {endRow}")
Next
Ten wzorzec ma szczególne znaczenie przy odczytywaniu dużych plików Excel w języku C#, gdzie występują ograniczenia pamięci.
Jak zapisać tabelę danych do bazy danych?
Po uzyskaniu DataTable, wstawienie go do SQL Server za pomocą SqlBulkCopy jest najszybszym sposobem w przypadku dużych zbiorów danych. SqlBulkCopy przyjmuje bezpośrednio DataTable i przesyła wiersze partiami bez tworzenia poszczególnych instrukcji INSERT.
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;
WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);
string connectionCiąg znaków = "Server=.;Database=OrdersDB;Trusted_Connection=True;";
using SqlConnection connection = new(connectionCiąg znaków);
connection.Open();
using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;
// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
using IronXL;
using System.Data;
using Microsoft.Data.SqlClient;
WorkBook workbook = WorkBook.Load("orders.xlsx");
DataTable dataTable = workbook.DefaultWorkSheet.ToDataTable(true);
string connectionCiąg znaków = "Server=.;Database=OrdersDB;Trusted_Connection=True;";
using SqlConnection connection = new(connectionCiąg znaków);
connection.Open();
using SqlBulkCopy bulkCopy = new(connection);
bulkCopy.DestinationTableName = "dbo.Orders";
bulkCopy.BatchSize = 500;
bulkCopy.BulkCopyTimeout = 60;
// Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID");
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName");
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount");
bulkCopy.WriteToServer(dataTable);
Console.WriteLine("Bulk insert complete.");
Imports IronXL
Imports System.Data
Imports Microsoft.Data.SqlClient
Dim workbook As WorkBook = WorkBook.Load("orders.xlsx")
Dim dataTable As DataTable = workbook.DefaultWorkSheet.ToDataTable(True)
Dim connectionCiągZnaków As String = "Server=.;Database=OrdersDB;Trusted_Connection=True;"
Using connection As New SqlConnection(connectionCiągZnaków)
connection.Open()
Using bulkCopy As New SqlBulkCopy(connection)
bulkCopy.DestinationTableName = "dbo.Orders"
bulkCopy.BatchSize = 500
bulkCopy.BulkCopyTimeout = 60
' Map DataTable columns to database columns
bulkCopy.ColumnMappings.Add("OrderID", "OrderID")
bulkCopy.ColumnMappings.Add("CustomerName", "CustomerName")
bulkCopy.ColumnMappings.Add("TotalAmount", "TotalAmount")
bulkCopy.WriteToServer(dataTable)
End Using
End Using
Console.WriteLine("Bulk insert complete.")
Uwagi dotyczące mapowania kolumn
Kolekcja ColumnMappings dopasowuje nazwy kolumn DataTable do nazw kolumn w bazie danych. Jeśli obie nazwy są identyczne, można pominąć indywidualne mapowania, a SqlBulkCopy zostanie automatycznie dopasowane na podstawie nazwy. Jawnym mapowaniom można zaufać bardziej, gdy kolejność kolumn w arkuszu kalkulacyjnym różni się od schematu bazy danych.
Więcej informacji na temat łączenia IronXL z procesami pracy z bazami danych można znaleźć w przewodniku po importowaniu do programu Excel w języku C#, który obejmuje dodatkowe scenariusze importu, w tym walidację przed wstawieniem.
W przypadku projektów opartych na Entity Framework należy najpierw przekonwertować wiersze DataTable na obiekty modelu typowanego, a następnie użyć DbContext.BulkInsert z biblioteki takiej jak EFCore.BulkExtensions do wstawiania partii danych z obsługą ORM. Dokumentacja Microsoftu dotycząca SqlBulkCopy szczegółowo wyjaśnia opcje przetwarzania wsadowego i obsługę transakcji.
Jakie są Twoje kolejne kroki?
Masz teraz kompletny zestaw narzędzi do przenoszenia danych między Excelem a DataTable w obu kierunkach przy użyciu IronXL:
- Konwersja pełnego arkusza z
worksheet.ToDataTable(true)w celu eksportu z uwzględnieniem nagłówków - Eksportuj określony zakres komórek za pomocą składni
worksheet["A1:D20"].ToDataTable(true) - Konwertuj skoroszyty wielarkuszowe za pomocą
workbook.ToDataSet(), aby uzyskać pełny dostęp doDataSet - Zapisz zawartość
DataTablez powrotem do pliku XLSX, iterując wartościDataRowza pomocąSetCellValue - Powiąż
DataTablez kontrolkami interfejsu użytkownika, takimi jakDataGridView, za pomocą pojedynczego przypisaniaDataSource - Przesyłaj dane bezpośrednio z
DataTabledoSqlBulkCopyw celu wstawiania danych do bazy danych z dużą przepustowością
Aby pogłębić swoje umiejętności w zakresie IronXL, zapoznaj się z następującymi powiązanymi tematami:
- Eksportowanie DataSet i DataTable — pełna Dokumentacja API
- Konwersja pliku Excel do tabeli danych (DataTable) w języku C# bez użycia OleDb
- Samouczek dotyczący eksportu tabeli danych C# do programu Excel
- Eksportuj tabelę danych do programu Excel z ASP.NET
- Najszybszy sposób na wyeksportowanie tabeli danych do programu Excel
- Ładowanie i odczytywanie plików Excel w języku C#
- Eksportuj pliki Excel z zachowaniem formatowania
- Odczytywanie plików Excel w języku C# — najlepsze praktyki
- Wybieranie i manipulowanie zakresami w Excelu w języku C#
- Importuj dane z Excela do aplikacji C#
Zacznij od bezpłatnej licencji próbnej IronXL, aby uruchomić te przykłady we własnych projektach. Gdy będziesz gotowy do wdrożenia, kup licencję produkcyjną lub skontaktuj się z zespołem, aby uzyskać wskazówki dotyczące licencjonowania.
!{--01001100010010010100001001010010010000010101001001011001010111110100011101000101010101000101111101010011010101000100000101010010010101000100010101000100010111110101011101001001010100010010000101111101010000010100100100111101000100010101010100001101010100010111110101010001010010010010010100000101001100010111110100001001001100010011110100001101001011--}
Często Zadawane Pytania
Jak mogę wyeksportować dane z Excela do tabeli danych (DataTable) w języku C# przy użyciu biblioteki IronXL?
Można wyeksportować dane z Excela do obiektu DataTable w języku C# za pomocą biblioteki IronXL, ładując plik Excel do IronXL, wybierając arkusz lub zakres, a następnie używając metody ExportToDataTable do konwersji danych na obiekt DataTable.
Jakie są zalety konwersji danych z Excela do tabeli danych (DataTable)?
Konwersja danych z Excela do tabeli danych (DataTable) zapewnia uporządkowane dane, które idealnie nadają się do operacji na bazach danych, powiązania danych z kontrolkami interfejsu użytkownika oraz płynnej integracji z platformą .NET. Ułatwia to również manipulowanie danymi i ich przetwarzanie w aplikacjach napisanych w języku C#.
Czy IronXL obsługuje zarówno import, jak i eksport danych między Excelem a DataTable?
Tak, IronXL sprawnie obsługuje zarówno importowanie danych z Excela do DataTable, jak i eksportowanie danych z DataTable do Excela, co czyni go wszechstronnym narzędziem do zarządzania wymianą danych w aplikacjach C#.
Czy za pomocą IronXL można przekonwertować określone zakresy w arkuszu Excel na tabelę danych (DataTable)?
Tak, IronXL pozwala na zaznaczenie określonych zakresów w arkuszu Excel i przekształcenie ich w tabelę danych (DataTable), co zapewnia elastyczność w manipulowaniu danymi i ich pozyskiwaniu.
Czy muszę mieć zainstalowany pakiet Microsoft Office, aby korzystać z IronXL do konwersji danych z Excela?
Nie, nie musisz mieć zainstalowanego pakietu Microsoft Office na swoim komputerze, aby korzystać z IronXL do konwersji danych z Excela do DataTable lub odwrotnie. IronXL działa niezależnie od pakietu Microsoft Office.
Jakie typy danych można konwertować z Excela do DataTable za pomocą IronXL?
IronXL może konwertować różne typy danych z Excela, w tym liczby, tekst, daty i formuły, do formatu DataTable, zachowując integralność i strukturę danych.
Czy IronXL może wyeksportować tabelę danych z powrotem do pliku Excel?
Tak, IronXL może eksportować tabelę danych z powrotem do pliku Excel, umożliwiając generowanie raportów lub tworzenie rozwiązań do przechowywania danych bezpośrednio z aplikacji napisanych w języku C#.




