最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)到Excel的完整源碼指南

 更新時(shí)間:2025年12月02日 09:33:18   作者:溫鐵軍  
這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)到Excel的完整源碼,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

簡(jiǎn)介:在.NET框架中,C# WinForm應(yīng)用能夠利用Excel Interop接口將DataTable中的數(shù)據(jù)導(dǎo)出到Excel文件。這個(gè)功能對(duì)數(shù)據(jù)報(bào)告、分析等場(chǎng)景至關(guān)重要。源碼涵蓋了創(chuàng)建Excel實(shí)例、操作工作簿/工作表、數(shù)據(jù)寫(xiě)入、樣式定制和資源清理等步驟。它要求用戶(hù)機(jī)器上安裝有Office,但對(duì)大量數(shù)據(jù)而言,更推薦使用Open XML SDK或EPPlus等方法。源碼可能包含一個(gè)靜態(tài)方法或類(lèi),接收DataTable參數(shù)以執(zhí)行導(dǎo)出任務(wù),并設(shè)計(jì)接口以支持不同的數(shù)據(jù)源。

1. C#與Excel Interop交互

在現(xiàn)代的企業(yè)級(jí)應(yīng)用中,與Excel文件的交互是一項(xiàng)常見(jiàn)且重要功能,尤其是處理表格數(shù)據(jù)時(shí)。通過(guò)C#中的Excel Interop對(duì)象模型,開(kāi)發(fā)者能夠直接在應(yīng)用程序中創(chuàng)建、讀取和修改Excel工作簿,從而極大簡(jiǎn)化了數(shù)據(jù)處理流程。本章將帶你入門(mén),了解如何利用C#與Excel進(jìn)行有效的交互。

1.1 COM對(duì)象模型及Interop服務(wù)介紹

組件對(duì)象模型(Component Object Model, COM)是微軟提出的一種二進(jìn)制接口標(biāo)準(zhǔn),用于軟件組件之間通信。在C#與Excel交互的場(chǎng)景中,COM對(duì)象模型允許C#代碼訪問(wèn)并操作Excel應(yīng)用程序中的各種對(duì)象,如工作簿、工作表、單元格等。

Interop服務(wù)(Interoperability Service)是.NET框架提供的一個(gè)特性,它允許托管代碼與非托管的COM對(duì)象進(jìn)行交互。通過(guò)引入Interop,C#程序可以“橋接”到Excel的COM對(duì)象模型,實(shí)現(xiàn)交互操作。

1.2 實(shí)現(xiàn)C#代碼中的Excel操作

首先,我們需要在C#項(xiàng)目中添加對(duì)應(yīng)的COM引用:

using Excel = Microsoft.Office.Interop.Excel;

隨后,啟動(dòng)Excel應(yīng)用程序并打開(kāi)一個(gè)工作簿:

Excel.Application xlApp = new Excel.Application();
xlApp.Visible = true; // 可選項(xiàng),設(shè)置為false可以隱藏Excel界面

// 打開(kāi)一個(gè)工作簿
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"C:\path\to\your\workbook.xlsx");

創(chuàng)建新的工作簿也十分簡(jiǎn)單:

Excel.Workbook newWorkbook = xlApp.Workbooks.Add();

上述步驟只是與Excel交互的起始點(diǎn),接下來(lái)我們將探索如何深入操作Excel工作表,包括插入數(shù)據(jù)、格式化單元格等,這將在后續(xù)章節(jié)中詳細(xì)介紹。

通過(guò)本章的學(xué)習(xí),你將掌握C#與Excel交互的基礎(chǔ),為后續(xù)章節(jié)中更復(fù)雜的操作打下堅(jiān)實(shí)的基礎(chǔ)。

2. DataTable數(shù)據(jù)結(jié)構(gòu)操作

2.1 DataTable的基本概念與應(yīng)用

DataTable的結(jié)構(gòu)與特性

DataTable 是.NET Framework中用于表示內(nèi)存中的表的數(shù)據(jù)結(jié)構(gòu)。它提供了一個(gè)類(lèi)似數(shù)據(jù)庫(kù)表的結(jié)構(gòu)來(lái)存儲(chǔ)、操作和傳輸數(shù)據(jù)。 DataTable DataSet 的一個(gè)組成部分,可以包含數(shù)據(jù)列( DataColumn )、數(shù)據(jù)行( DataRow )、約束( DataConstraint )等。它支持復(fù)雜的數(shù)據(jù)操作,如數(shù)據(jù)排序、篩選以及自定義數(shù)據(jù)關(guān)系等。

在C#開(kāi)發(fā)中, DataTable 常用于數(shù)據(jù)綁定、數(shù)據(jù)暫存以及數(shù)據(jù)交換等多種場(chǎng)景。它可以獨(dú)立使用,也可以通過(guò) DataRelation 形成具有層級(jí)關(guān)系的數(shù)據(jù)集 DataSet 。 DataTable 可以通過(guò) DataView 進(jìn)行顯示和操作,支持通過(guò) DataRow RowState 跟蹤數(shù)據(jù)行的更改狀態(tài)。

DataTable的數(shù)據(jù)添加、刪除與查詢(xún)

在實(shí)際應(yīng)用中,我們經(jīng)常需要向DataTable中添加數(shù)據(jù),同時(shí)刪除不再需要的數(shù)據(jù)記錄,或根據(jù)特定條件查詢(xún)數(shù)據(jù)。以下是一個(gè)示例代碼,展示了如何在 DataTable 中添加、刪除以及查詢(xún)數(shù)據(jù):

DataTable dataTable = new DataTable();
dataTable.Columns.Add("ID", typeof(int));
dataTable.Columns.Add("Name", typeof(string));
// 添加數(shù)據(jù)
for (int i = 1; i <= 10; i++)
{
    dataTable.Rows.Add(i, "Name" + i);
}
// 刪除數(shù)據(jù)
DataRow[] rows = dataTable.Select("ID > 5");
foreach (DataRow row in rows)
{
    row.Delete();
}
// 提交更改
dataTable.AcceptChanges();
// 查詢(xún)數(shù)據(jù)
DataRow foundRow = dataTable.Rows.Find(3);
if (foundRow != null)
{
    Console.WriteLine("Found: " + foundRow["Name"]);
}
else
{
    Console.WriteLine("Not found.");
}

在這個(gè)例子中,首先創(chuàng)建了一個(gè)具有兩列的 DataTable 。然后通過(guò)循環(huán)添加了10條數(shù)據(jù)記錄,使用 Select 方法查詢(xún)ID大于5的所有行,并將這些行刪除。最后,通過(guò) Rows.Find 方法查找ID為3的記錄。注意,對(duì)數(shù)據(jù)進(jìn)行添加、修改和刪除后,必須調(diào)用 AcceptChanges 方法,以便確定哪些更改已經(jīng)被接受,并反映到 DataRow RowState 上。

2.2 DataTable與數(shù)據(jù)源的交互

從數(shù)據(jù)庫(kù)加載數(shù)據(jù)到DataTable

DataTable可以輕松地從多種數(shù)據(jù)源(如SQL Server、Oracle、MySQL等)加載數(shù)據(jù)。使用 DataAdapter 類(lèi)和相應(yīng)的數(shù)據(jù)庫(kù)連接( SqlConnection 、 OracleConnection 等),可以填充DataTable中的數(shù)據(jù)。

以下是一個(gè)使用 SqlDataAdapter 從SQL Server數(shù)據(jù)庫(kù)加載數(shù)據(jù)到DataTable的示例:

string connectionString = "Data Source=服務(wù)器地址;Initial Catalog=數(shù)據(jù)庫(kù)名;User ID=用戶(hù)名;Password=密碼";
SqlConnection connection = new SqlConnection(connectionString);
string query = "SELECT * FROM Users";

SqlDataAdapter adapter = new SqlDataAdapter(query, connection);
DataTable dataTable = new DataTable();
adapter.Fill(dataTable);
connection.Close();

// 現(xiàn)在dataTable包含了從數(shù)據(jù)庫(kù)查詢(xún)到的數(shù)據(jù)

在上述代碼中,首先創(chuàng)建了一個(gè) SqlConnection 實(shí)例,并用它來(lái)創(chuàng)建 SqlDataAdapter SqlDataAdapter 使用SQL查詢(xún)填充 DataTable 。最后,關(guān)閉數(shù)據(jù)庫(kù)連接以釋放資源。此時(shí) dataTable 中包含從數(shù)據(jù)庫(kù)表 Users 中檢索到的所有數(shù)據(jù)。

DataTable與LINQ的結(jié)合應(yīng)用

LINQ(Language Integrated Query,語(yǔ)言集成查詢(xún))是.NET中用于查詢(xún)數(shù)據(jù)的強(qiáng)大工具。LINQ提供了與 DataTable 交互的標(biāo)準(zhǔn)查詢(xún)運(yùn)算符,從而允許開(kāi)發(fā)者以聲明式方式編寫(xiě)查詢(xún)語(yǔ)句。

以下示例演示了如何使用LINQ查詢(xún) DataTable 中的數(shù)據(jù):

var query = from user in dataTable.AsEnumerable()
            where user.Field<string>("Name").StartsWith("N")
            select user;

foreach (DataRow row in query)
{
    Console.WriteLine("ID: " + row["ID"] + ", Name: " + row["Name"]);
}

在這個(gè)例子中,使用LINQ查詢(xún) dataTable 中所有名字以”N”開(kāi)頭的記錄,并遍歷查詢(xún)結(jié)果。 AsEnumerable 方法將 DataTable 轉(zhuǎn)換為可枚舉類(lèi)型,使LINQ能夠執(zhí)行查詢(xún)操作。 Field 方法用于訪問(wèn) DataRow 中的數(shù)據(jù),其參數(shù)指定列名和數(shù)據(jù)類(lèi)型。

2.3 DataTable數(shù)據(jù)的導(dǎo)出技巧

排序、篩選與分組導(dǎo)出

在將數(shù)據(jù)從DataTable導(dǎo)出到Excel之前,通常需要對(duì)數(shù)據(jù)進(jìn)行排序、篩選和分組。在.NET中,可以使用 DataView 來(lái)實(shí)現(xiàn)這些數(shù)據(jù)操作。

下面示例展示了如何使用 DataView 對(duì) DataTable 進(jìn)行排序、篩選和分組:

DataView view = dataTable.DefaultView;
view.Sort = "Name ASC"; // 按Name升序排序
view.RowFilter = "ID > 5"; // 篩選ID大于5的行
view.Grouping = "Name"; // 按Name分組

// 排序后的DataTable的分組與篩選后的結(jié)果可以通過(guò)DataView訪問(wèn)
foreach (DataRowView drv in view)
{
    Console.WriteLine("ID: " + drv["ID"] + ", Name: " + drv["Name"]);
}

在這個(gè)代碼片段中,通過(guò)設(shè)置 DataView Sort 屬性來(lái)對(duì)DataTable中的數(shù)據(jù)進(jìn)行排序,設(shè)置 RowFilter 屬性來(lái)過(guò)濾數(shù)據(jù),并通過(guò) Grouping 屬性對(duì)數(shù)據(jù)進(jìn)行分組。使用循環(huán)遍歷 DataView ,輸出排序、篩選和分組后的結(jié)果。

多表關(guān)聯(lián)與數(shù)據(jù)合并導(dǎo)出

在處理關(guān)系型數(shù)據(jù)時(shí),經(jīng)常會(huì)遇到需要對(duì)多個(gè)數(shù)據(jù)表進(jìn)行關(guān)聯(lián)查詢(xún)和數(shù)據(jù)合并的情況。在.NET中,可以使用LINQ來(lái)對(duì)多個(gè) DataTable 進(jìn)行關(guān)聯(lián)查詢(xún)和數(shù)據(jù)合并。

示例代碼展示了如何使用LINQ對(duì)兩個(gè) DataTable 進(jìn)行關(guān)聯(lián)查詢(xún)和數(shù)據(jù)合并:

var users = dataTable1.AsEnumerable();
var orders = dataTable2.AsEnumerable();

var result = from u in users
             join o in orders on u.Field<int>("UserID") equals o.Field<int>("UserID")
             select new { UserID = u["UserID"], UserName = u["Name"], OrderDetails = o["OrderDetails"] };

// 輸出合并后的結(jié)果
foreach (var item in result)
{
    Console.WriteLine($"User ID: {item.UserID}, Name: {item.UserName}, Order Details: {item.OrderDetails}");
}

在這個(gè)例子中,假設(shè)有兩個(gè) DataTable ,一個(gè)是用戶(hù)表(dataTable1),另一個(gè)是訂單表(dataTable2)。使用LINQ的join關(guān)鍵字對(duì)兩個(gè)表中具有共同 UserID 的記錄進(jìn)行關(guān)聯(lián)查詢(xún),并創(chuàng)建一個(gè)新的匿名類(lèi)型對(duì)象來(lái)存儲(chǔ)關(guān)聯(lián)結(jié)果。然后,遍歷并輸出合并后的結(jié)果。

3. Excel工作簿與工作表管理

3.1 Excel對(duì)象模型解析

工作簿與工作表對(duì)象的關(guān)系

在Excel應(yīng)用程序中,工作簿(Workbook)是一個(gè)獨(dú)立的文件,它由多個(gè)工作表(Worksheet)構(gòu)成。每個(gè)工作表又包含了一個(gè)網(wǎng)格,這個(gè)網(wǎng)格是由行(Rows)和列(Columns)組成的單元格(Cells)組成。理解它們的關(guān)系對(duì)于進(jìn)行復(fù)雜的數(shù)據(jù)操作至關(guān)重要。工作簿對(duì)象可以被看作是一個(gè)文件夾,工作表則是其中的文件。一個(gè)工作簿可以包含多個(gè)工作表,工作表之間的數(shù)據(jù)是相對(duì)獨(dú)立的,但可以通過(guò)公式或VBA進(jìn)行交互。

工作簿與工作表對(duì)象的關(guān)系模型可以用以下偽代碼簡(jiǎn)述:

// 工作簿對(duì)象
Workbook workbook;
// 工作簿中包含的多個(gè)工作表對(duì)象
Worksheet[] worksheets;

// 獲取工作簿中的工作表數(shù)量
int sheetCount = workbook.Worksheets.Count;
// 通過(guò)索引訪問(wèn)特定工作表
Worksheet specificSheet = workbook.Worksheets[1];

工作表的插入、刪除與重命名

在使用Excel Interop進(jìn)行操作時(shí),經(jīng)常需要對(duì)工作表進(jìn)行插入、刪除或重命名。這些操作直接關(guān)系到工作簿結(jié)構(gòu)的調(diào)整,對(duì)于數(shù)據(jù)的展示和管理非常關(guān)鍵。

// 插入一個(gè)新的工作表
Worksheet newSheet = workbook.Worksheets.Add();
// 刪除一個(gè)工作表
workbook.Worksheets.Delete(specificSheet);
// 重命名工作表
specificSheet.Name = "RenamedSheet";

插入工作表時(shí),可以指定其位置。刪除工作表則需要確保當(dāng)前工作表不是活動(dòng)的工作表,否則會(huì)拋出異常。重命名工作表時(shí),新的名稱(chēng)需要是唯一的,不能與工作簿中現(xiàn)有的其他工作表名稱(chēng)相同。

3.2 工作表內(nèi)容的動(dòng)態(tài)管理

單元格數(shù)據(jù)的設(shè)置與讀取

單元格是工作表的基本元素,單元格中的數(shù)據(jù)是我們操作Excel時(shí)關(guān)注的重點(diǎn)。通過(guò)設(shè)置和讀取單元格的數(shù)據(jù),我們可以進(jìn)行各種數(shù)據(jù)分析和展示。

// 設(shè)置單元格數(shù)據(jù)
specificSheet.Cells[1, 1] = "Sample Data";
// 讀取單元格數(shù)據(jù)
object cellValue = specificSheet.Cells[1, 1].Value;

單元格的數(shù)據(jù)可以是多種類(lèi)型,包括文本、數(shù)字、日期等。讀取單元格數(shù)據(jù)時(shí),可能會(huì)遇到類(lèi)型轉(zhuǎn)換問(wèn)題,因此在實(shí)際操作中需要注意數(shù)據(jù)類(lèi)型的一致性。

單元格樣式的批量應(yīng)用

單元格樣式是控制單元格外觀的重要元素,比如字體大小、顏色、對(duì)齊方式等。在處理大量數(shù)據(jù)時(shí),批量應(yīng)用單元格樣式可以極大提高效率。

// 創(chuàng)建并設(shè)置樣式
Style style = workbook.Styles.Add("MyStyle");
style.Font.Size = 12;
style.Font.Bold = true;
// 應(yīng)用樣式到指定單元格范圍
Range range = specificSheet.Range["A1:A10"];
range.Style = style;

當(dāng)樣式應(yīng)用到單元格范圍時(shí),需要注意范圍的邊界,確保不會(huì)出現(xiàn)越界錯(cuò)誤。樣式一旦創(chuàng)建,就可以在同一個(gè)工作簿的其他工作表或單元格中重復(fù)使用,這大大提高了代碼的復(fù)用性和維護(hù)性。

3.3 Excel工作簿的高級(jí)操作

保護(hù)工作簿與工作表

在多人協(xié)作的環(huán)境中,為了防止數(shù)據(jù)被誤修改,可以使用保護(hù)功能鎖定工作表或工作簿。

// 保護(hù)工作表
specificSheet.Protect(Password: "Password");
// 取消保護(hù)工作表
specificSheet.Unprotect("Password");
// 保護(hù)工作簿結(jié)構(gòu)
workbook.Protect(Password: "Password");

保護(hù)工作表可以阻止用戶(hù)對(duì)單元格的修改,還可以進(jìn)一步設(shè)置允許用戶(hù)執(zhí)行的操作,如格式化單元格、插入行等。而保護(hù)工作簿則可以鎖定工作簿的結(jié)構(gòu),防止添加、刪除工作表等操作。密碼保護(hù)使得只有知道密碼的用戶(hù)才能對(duì)工作表或工作簿進(jìn)行解鎖操作。

宏與VBA代碼的集成

宏是一種可以自動(dòng)化執(zhí)行重復(fù)任務(wù)的方式,通過(guò)VBA(Visual Basic for Applications)編寫(xiě)宏,可以增強(qiáng)Excel的功能和靈活性。

' VBA代碼示例
Sub MyMacro()
    ' VBA代碼邏輯
End Sub

在C#中,可以通過(guò)Interop服務(wù)創(chuàng)建宏,并將其附加到按鈕或快捷鍵上。宏的集成是提高Excel自動(dòng)化水平的一個(gè)重要環(huán)節(jié),尤其適用于需要重復(fù)執(zhí)行復(fù)雜操作的場(chǎng)景。

以上是第三章的核心內(nèi)容,具體操作步驟和示例代碼已經(jīng)詳細(xì)闡述。接下來(lái),我們將深入到第四章,詳細(xì)討論數(shù)據(jù)逐行寫(xiě)入Excel的高級(jí)技巧。

4. 數(shù)據(jù)逐行寫(xiě)入Excel

4.1 DataTable到Excel的行級(jí)映射

在將數(shù)據(jù)寫(xiě)入Excel時(shí),通常需要對(duì)數(shù)據(jù)進(jìn)行結(jié)構(gòu)化處理,以便與Excel的工作表行結(jié)構(gòu)對(duì)應(yīng)。我們通常使用 DataTable 來(lái)存儲(chǔ)和管理數(shù)據(jù),因?yàn)樗?NET中用來(lái)處理表格數(shù)據(jù)的一個(gè)基礎(chǔ)對(duì)象。本節(jié)將詳細(xì)探討如何將DataTable中的數(shù)據(jù)逐行映射到Excel工作表中,包括數(shù)據(jù)類(lèi)型轉(zhuǎn)換和格式化。

數(shù)據(jù)表中的每一行如何對(duì)應(yīng)到工作表

要將DataTable中的數(shù)據(jù)逐行寫(xiě)入Excel,首先需要?jiǎng)?chuàng)建一個(gè)Excel應(yīng)用程序?qū)嵗⒋蜷_(kāi)一個(gè)工作簿,然后獲取到對(duì)應(yīng)的工作表。在C#中,可以通過(guò)以下代碼實(shí)現(xiàn):

using Excel = Microsoft.Office.Interop.Excel;

public void WriteDataTableToExcel(DataTable table, string filePath)
{
    Excel.Application excelApp = new Excel.Application();
    if (excelApp == null)
    {
        throw new Exception("Excel application could not be launched");
    }

    Excel.Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
    Excel._Worksheet worksheet = workbook.Sheets[1];

    // 假設(shè)table為已經(jīng)填充好的DataTable
    for (int i = 0; i < table.Rows.Count; i++)
    {
        for (int j = 0; j < table.Columns.Count; j++)
        {
            worksheet.Cells[i + 1, j + 1] = table.Rows[i][j]; // 將DataTable的值寫(xiě)入Excel單元格
        }
    }

    // 設(shè)置標(biāo)題行
    for (int j = 0; j < table.Columns.Count; j++)
    {
        worksheet.Cells[1, j + 1] = table.Columns[j].Caption;
    }

    // 保存并關(guān)閉工作簿
    workbook.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
    workbook.Close(false, Type.Missing, Type.Missing);
    excelApp.Quit();

    // 釋放COM對(duì)象
    releaseObject(worksheet);
    releaseObject(workbook);
    releaseObject(excelApp);
}

在上述代碼中, WriteDataTableToExcel 方法接受一個(gè) DataTable 對(duì)象和文件路徑作為參數(shù)。代碼塊首先打開(kāi)一個(gè)新的Excel工作簿,然后通過(guò)雙層循環(huán)將DataTable中的每一行和每一個(gè)單元格的值寫(xiě)入到Excel工作表中。

數(shù)據(jù)類(lèi)型轉(zhuǎn)換與格式化

在上述過(guò)程中,每個(gè)單元格的值是直接寫(xiě)入Excel,但是Excel內(nèi)部對(duì)不同類(lèi)型的數(shù)據(jù)有不同的處理方式。比如,如果DataTable中包含的是日期類(lèi)型數(shù)據(jù),而直接寫(xiě)入會(huì)導(dǎo)致Excel將其作為普通文本處理。因此,需要在寫(xiě)入前進(jìn)行類(lèi)型轉(zhuǎn)換和格式化。具體實(shí)現(xiàn)如下:

// 在寫(xiě)入之前,先進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換和格式化
for (int i = 0; i < table.Rows.Count; i++)
{
    for (int j = 0; j < table.Columns.Count; j++)
    {
        var value = table.Rows[i][j];
        if (value != DBNull.Value)
        {
            // 數(shù)據(jù)類(lèi)型檢測(cè)并轉(zhuǎn)換
            if (value is DateTime)
            {
                worksheet.Cells[i + 1, j + 1].Value2 = ((DateTime)value).ToShortDateString();
            }
            else
            {
                worksheet.Cells[i + 1, j + 1].Value2 = value.ToString();
            }
        }
        else
        {
            worksheet.Cells[i + 1, j + 1].Value2 = null;
        }
    }
}

在這個(gè)例子中,我們通過(guò)檢查DataTable中的數(shù)據(jù)類(lèi)型來(lái)執(zhí)行不同的處理。如果數(shù)據(jù)是日期類(lèi)型(DateTime),則在寫(xiě)入Excel之前將其格式化為日期短字符串。如果數(shù)據(jù)類(lèi)型不是DateTime,則直接將數(shù)據(jù)轉(zhuǎn)換為其字符串表示。這樣做可以確保數(shù)據(jù)在Excel中以正確的格式顯示,包括日期和數(shù)字的正確解析。

對(duì)于表格內(nèi)數(shù)據(jù)類(lèi)型的映射和格式化操作,需要開(kāi)發(fā)者有良好的數(shù)據(jù)處理和類(lèi)型判斷的能力。這樣的操作不僅僅能夠提高數(shù)據(jù)的可讀性,而且能夠避免在數(shù)據(jù)交換過(guò)程中的潛在錯(cuò)誤。

4.2 處理數(shù)據(jù)與Excel格式的兼容性

處理數(shù)據(jù)兼容性是數(shù)據(jù)導(dǎo)出過(guò)程中不可或缺的一環(huán)。由于Excel本身對(duì)于數(shù)據(jù)類(lèi)型的處理和顯示方式有其特定規(guī)則,開(kāi)發(fā)者在編程中需要特別注意數(shù)據(jù)與Excel格式的兼容性問(wèn)題。

特殊數(shù)據(jù)格式的處理方法

在某些情況下,DataTable中的數(shù)據(jù)可能包含一些特殊格式,例如貨幣、百分比或者科學(xué)計(jì)數(shù)法表示的數(shù)據(jù)。對(duì)于這些特殊格式的處理,需要在寫(xiě)入Excel時(shí)進(jìn)行相應(yīng)的格式化操作。

例如,若要將DataTable中的某個(gè)列為貨幣格式,可以在寫(xiě)入單元格之前,將該列數(shù)據(jù)格式化為Excel的貨幣格式。以下是一個(gè)示例代碼:

// 假設(shè)我們要將某個(gè)列格式化為貨幣格式
for (int i = 0; i < table.Rows.Count; i++)
{
    // 獲取貨幣格式化字符串
    string currencyFormat = string.Format("c", System.Globalization.CultureInfo.CurrentCulture);

    // 假設(shè)我們要格式化的列是第三列(索引為2)
    double value = Convert.ToDouble(table.Rows[i][2]);
    worksheet.Cells[i + 1, 3].NumberFormat = currencyFormat; // 設(shè)置列的格式
    worksheet.Cells[i + 1, 3].Value2 = value; // 設(shè)置列的值
}

日期和時(shí)間數(shù)據(jù)的適配

處理日期和時(shí)間數(shù)據(jù)時(shí),需要特別注意Excel對(duì)日期和時(shí)間的內(nèi)部表示。Excel使用一個(gè)從1900年1月0日開(kāi)始計(jì)算的連續(xù)序列號(hào)來(lái)存儲(chǔ)日期和時(shí)間信息,因此在將日期時(shí)間數(shù)據(jù)寫(xiě)入Excel時(shí),需要將.NET的DateTime對(duì)象轉(zhuǎn)換為相應(yīng)的序列號(hào)。

// 示例代碼展示如何將DateTime轉(zhuǎn)換為Excel中的序列號(hào)
DateTime dateValue = DateTime.Parse("2023-04-01");
double excelSerialDate = dateValue.ToOADate();
worksheet.Cells[i + 1, j + 1].Value2 = excelSerialDate;

通過(guò)使用 ToOADate() 方法,可以將.NET的DateTime對(duì)象轉(zhuǎn)換為Excel能夠識(shí)別的序列號(hào)。寫(xiě)入Excel后,Excel會(huì)自動(dòng)將這個(gè)序列號(hào)顯示為日期或時(shí)間格式。

在處理數(shù)據(jù)和Excel格式兼容性的過(guò)程中,開(kāi)發(fā)者需要對(duì)數(shù)據(jù)類(lèi)型轉(zhuǎn)換和數(shù)據(jù)格式化有清晰的認(rèn)識(shí),并且能夠根據(jù)實(shí)際需求靈活運(yùn)用。這不僅關(guān)系到數(shù)據(jù)的正確顯示,而且直接關(guān)聯(lián)到數(shù)據(jù)處理的效率和準(zhǔn)確性。

4.3 提升寫(xiě)入性能的策略

在進(jìn)行大數(shù)據(jù)量的Excel導(dǎo)出操作時(shí),性能成為了一個(gè)不得不考慮的關(guān)鍵因素。提升性能不僅能夠提高用戶(hù)體驗(yàn),還能避免因?yàn)椴僮骶徛鴮?dǎo)致的資源浪費(fèi)。

批量寫(xiě)入與單行寫(xiě)入的性能比較

在實(shí)現(xiàn)DataTable到Excel的映射時(shí),一個(gè)簡(jiǎn)單的做法是遍歷DataTable的每一行,然后將每行的數(shù)據(jù)逐個(gè)單元格地寫(xiě)入Excel。然而,這種方式在處理大量數(shù)據(jù)時(shí)效率低下。

批量寫(xiě)入方式通過(guò)減少對(duì)COM對(duì)象的調(diào)用次數(shù)來(lái)提高性能,具體實(shí)現(xiàn)方式可以是將DataTable中的多行數(shù)據(jù)先寫(xiě)入內(nèi)存中的一個(gè)二維數(shù)組,然后再一次性寫(xiě)入到Excel工作表中。以下是代碼示例:

// 通過(guò)二維數(shù)組實(shí)現(xiàn)批量寫(xiě)入
object[,] dataToWrite = new object[table.Rows.Count, table.Columns.Count];
for (int i = 0; i < table.Rows.Count; i++)
{
    for (int j = 0; j < table.Columns.Count; j++)
    {
        dataToWrite[i, j] = table.Rows[i][j];
    }
}
rangeValue.Value2 = dataToWrite; // rangeValue是Excel范圍對(duì)象

這種方式比逐個(gè)單元格寫(xiě)入效率更高,因?yàn)樗鼫p少了COM對(duì)象的調(diào)用次數(shù),尤其是在內(nèi)存中的操作往往比直接寫(xiě)入Excel要快。

使用異步操作優(yōu)化性能

使用異步編程可以提高應(yīng)用程序的響應(yīng)性,尤其是在數(shù)據(jù)量較大時(shí),不會(huì)阻塞主線程的執(zhí)行。在.NET中,可以使用 async await 關(guān)鍵字來(lái)編寫(xiě)異步代碼。

下面是一個(gè)簡(jiǎn)單的異步寫(xiě)入Excel的例子:

public async Task WriteDataTableToExcelAsync(DataTable table, string filePath)
{
    Excel.Application excelApp = new Excel.Application();
    if (excelApp == null)
    {
        throw new Exception("Excel application could not be launched");
    }

    Excel.Workbook workbook = excelApp.Workbooks.Add(Type.Missing);
    Excel._Worksheet worksheet = workbook.Sheets[1];

    // 異步寫(xiě)入操作
    await Task.Run(() =>
    {
        for (int i = 0; i < table.Rows.Count; i++)
        {
            for (int j = 0; j < table.Columns.Count; j++)
            {
                worksheet.Cells[i + 1, j + 1] = table.Rows[i][j];
            }
        }

        // 設(shè)置標(biāo)題行
        for (int j = 0; j < table.Columns.Count; j++)
        {
            worksheet.Cells[1, j + 1] = table.Columns[j].Caption;
        }
    });

    // 異步保存和關(guān)閉工作簿
    await Task.Run(() =>
    {
        workbook.SaveAs(filePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
        workbook.Close(false, Type.Missing, Type.Missing);
        excelApp.Quit();
    });

    // 釋放COM對(duì)象
    releaseObject(worksheet);
    releaseObject(workbook);
    releaseObject(excelApp);
}

在這個(gè)示例中,將工作簿的創(chuàng)建和寫(xiě)入操作放在了異步任務(wù)中執(zhí)行,這樣可以使主線程在等待Excel處理時(shí)不被阻塞,從而提高應(yīng)用程序的整體性能和用戶(hù)體驗(yàn)。需要注意的是,雖然異步操作可以提高性能,但它也引入了額外的復(fù)雜性。開(kāi)發(fā)者需要確保正確地管理異步任務(wù),并在適當(dāng)?shù)臅r(shí)候釋放資源。

5. Excel文件樣式自定義

5.1 Excel樣式概覽

單元格、行和列的樣式屬性

Microsoft Excel提供了豐富的樣式屬性,可以應(yīng)用于單元格、行和列,以改善數(shù)據(jù)的可讀性和吸引力。這些屬性包括字體、顏色、邊框、對(duì)齊方式、背景填充、保護(hù)等。樣式屬性不僅能夠提升文檔的專(zhuān)業(yè)外觀,也便于對(duì)關(guān)鍵數(shù)據(jù)進(jìn)行視覺(jué)上的突出。

  • 字體屬性:字體屬性包括字體名稱(chēng)、大小、樣式(粗體、斜體等)、顏色等。通過(guò)這些屬性,用戶(hù)可以使得Excel中的文字內(nèi)容更加清晰,更具有閱讀性。
  • 顏色和填充:?jiǎn)卧竦念伾吞畛溥x項(xiàng)提供了靈活的視覺(jué)定制功能??梢赃x擇純色填充,也可以使用漸變色或是圖案填充來(lái)增加視覺(jué)效果。
  • 邊框樣式:邊框樣式是Excel中強(qiáng)大的樣式屬性之一,能夠?yàn)閿?shù)據(jù)提供框架和視覺(jué)界限。可以設(shè)置邊框的線型、顏色以及邊框的粗細(xì)。
  • 對(duì)齊與文本方向:對(duì)齊屬性決定了文本在單元格中的位置,以及文本的水平和垂直方向??梢詫?shí)現(xiàn)文本的左對(duì)齊、右對(duì)齊、居中對(duì)齊,以及文本方向的調(diào)整。

樣式模板的創(chuàng)建與應(yīng)用

創(chuàng)建樣式模板是一種節(jié)省時(shí)間,保持一致性的有效方法。樣式模板能夠存儲(chǔ)一系列的格式設(shè)置,之后可以應(yīng)用于一個(gè)或多個(gè)單元格、行或列。創(chuàng)建模板的步驟如下:

  • 選擇已經(jīng)格式化好的單元格。
  • 右鍵點(diǎn)擊選擇“格式化單元格”。
  • 在彈出的對(duì)話框中設(shè)置所需的格式選項(xiàng)。
  • 點(diǎn)擊“確定”,然后選擇“樣式”。
  • 在樣式對(duì)話框中點(diǎn)擊“新建”。
  • 輸入新的樣式名稱(chēng),并確認(rèn)保存。

一旦模板被創(chuàng)建,就可以應(yīng)用到Excel工作表的其他部分,通過(guò)“格式刷”或者在“樣式”對(duì)話框中選擇來(lái)快速應(yīng)用樣式。

5.2 自定義字體和顏色方案

字體大小、樣式和顏色的選擇

在Excel中,字體的大小、樣式和顏色是突出顯示特定數(shù)據(jù)或改善整體文檔外觀的關(guān)鍵元素。自定義這些屬性可以幫助用戶(hù)創(chuàng)造獨(dú)特的文檔風(fēng)格和品牌標(biāo)識(shí)。

字體大小

字體大小決定了文本的可讀性,特別是在打印文檔時(shí),較大的字體大小有利于清晰展示數(shù)據(jù)。Excel中的默認(rèn)字體大小為11,但可以根據(jù)需要調(diào)整。

// C# 代碼示例:設(shè)置Excel單元格字體大小
var cell = worksheet.get_Range("A1");
cell.Font.Size = 12; // 設(shè)置字體大小為12

字體樣式

除了大小之外,字體樣式也是文本外觀的重要組成部分。粗體、斜體或加下劃線等樣式可以用來(lái)強(qiáng)調(diào)重要的信息。

// C# 代碼示例:設(shè)置Excel單元格字體樣式為粗體和斜體
cell.Font.Bold = true;
cell.Font.Italic = true;

字體顏色

字體顏色可以影響信息的可讀性和吸引力。使用不同顏色,可以區(qū)分不同的數(shù)據(jù)集或強(qiáng)調(diào)重要信息。

// C# 代碼示例:設(shè)置Excel單元格字體顏色
cell.Font.Color = System.Drawing.Color.Red; // 設(shè)置字體顏色為紅色

顏色漸變與圖案填充

顏色漸變和圖案填充為Excel提供了視覺(jué)多樣性的另一種方式。漸變效果可以是線性的,也可以是徑向的,而圖案填充則可以基于不同的圖案和顏色組合。

顏色漸變

漸變效果可以使單元格的背景從一種顏色平滑過(guò)渡到另一種顏色。顏色漸變?cè)谝曈X(jué)上可以是非常吸引人的,特別是在用做圖表背景或者數(shù)據(jù)突出顯示時(shí)。

// C# 代碼示例:創(chuàng)建顏色漸變效果
var gradientFill = cell.Interior????.Interior as Excel.GradientFill;
gradientFill.Type = Excel.XlGradientType.xlGradientHorizontal; // 水平漸變
gradientFill.GradientStops.Insert("Color1", Excel.XlRgbColor.rgbRed);
gradientFill.GradientStops.Insert("Color2", Excel.XlRgbColor.rgbBlue);

圖案填充

圖案填充則是使用不同的圖案和顏色組合為單元格提供背景。這種填充方式可以用在需要區(qū)分不同類(lèi)型數(shù)據(jù)的場(chǎng)景中。

// C# 代碼示例:創(chuàng)建圖案填充效果
cell.Interior新模式 = XlPattern.xlPatternDarkUpwardDiagonal;
cell.Interior新模式.Color = System.Drawing.Color.Gray;
cell.Interior新模式.TintAndShade = 0;

5.3 邊框和圖案的高級(jí)定制

邊框類(lèi)型的設(shè)置和應(yīng)用

Excel允許用戶(hù)對(duì)單元格進(jìn)行邊框定制,包括線型、顏色和粗細(xì)等屬性。邊框可以是細(xì)線、粗線、點(diǎn)線或者混合線型,并且可以設(shè)置邊框的四個(gè)方向:上、下、左、右。

// C# 代碼示例:設(shè)置Excel單元格邊框
var borders = cell.Borders;
borders[XlBordersIndex.xlEdgeLeft].LineStyle = XlLineStyle.xlContinuous;
borders[XlBordersIndex.xlEdgeLeft].Color = System.Drawing.Color.Black;
borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThin;
// 重復(fù)設(shè)置其他邊框

圖案填充和單元格對(duì)齊

圖案填充可以應(yīng)用于單元格,允許用戶(hù)使用各種圖案替代純色填充,提供獨(dú)特的視覺(jué)效果。例如,在單元格內(nèi)填充小點(diǎn)、網(wǎng)格線或者斜線圖案等。

// C# 代碼示例:設(shè)置Excel單元格圖案填充
cell.Interior新模式 = XlPattern.xlPatternLightDownwardDiagonal;
cell.Interior新模式.Color = System.Drawing.Color.Yellow;
cell.Interior新模式.TintAndShade = 0;

單元格對(duì)齊包括文本的水平和垂直對(duì)齊方式。比如,可以根據(jù)需要讓文本左對(duì)齊、居中對(duì)齊或者右對(duì)齊,也可以設(shè)置垂直對(duì)齊為頂端、居中或者底部對(duì)齊。

// C# 代碼示例:設(shè)置Excel單元格對(duì)齊
cell.VerticalAlignment = XlVAlign.xlVAlignCenter;
cell.HorizontalAlignment = XlHAlign.xlHAlignCenter;

通過(guò)以上方法,開(kāi)發(fā)者能夠在使用C#與Excel Interop進(jìn)行交互時(shí),為Excel文件的樣式進(jìn)行定制化設(shè)計(jì),以適應(yīng)不同場(chǎng)景的需求,從而提高信息的表達(dá)質(zhì)量和用戶(hù)體驗(yàn)。

6. 文件保存及資源清理

在完成了對(duì)Excel文件的創(chuàng)建、編輯和樣式應(yīng)用之后,最終的步驟是確保文件被正確保存,并且所有的資源都得到妥善清理。本章將深入探討Excel文件的保存選項(xiàng),如何安全關(guān)閉Excel進(jìn)程,以及如何處理異常情況和進(jìn)行資源清理的最佳實(shí)踐。

6.1 Excel文件的保存與導(dǎo)出選項(xiàng)

Excel提供了多種保存與導(dǎo)出選項(xiàng),以滿(mǎn)足不同場(chǎng)景的需求。了解這些選項(xiàng)及其適用情況,對(duì)于確保數(shù)據(jù)正確性和用戶(hù)友好性至關(guān)重要。

保存和另存為的不同場(chǎng)景

保存 操作將對(duì)當(dāng)前打開(kāi)的Excel工作簿進(jìn)行更改保存,覆蓋原有文件,而 另存為 則是創(chuàng)建一個(gè)工作簿的新副本,并可選擇保存在不同的位置或格式。這些場(chǎng)景的例子包括:

  • 覆蓋原文件 : 當(dāng)你對(duì)工作簿完成了一次性的編輯并希望更新原文件時(shí),使用“保存”功能。
  • 保存為新文件 : 如果你需要保留原工作簿的版本并為特定用戶(hù)或用途創(chuàng)建一個(gè)新的版本,使用“另存為”功能,并選擇不同的文件名或位置。

導(dǎo)出為PDF和打印選項(xiàng)

除了常規(guī)的Excel文件格式,C#與Excel Interop交互還允許開(kāi)發(fā)者導(dǎo)出工作簿為PDF格式,或直接發(fā)送至打印機(jī)。這些功能在需要共享不可編輯的文件或打印報(bào)表時(shí)非常有用。

// 示例代碼:將Excel工作簿保存為PDF
workbook.ExportAsFixedFormat(XlFixedFormatType.xlTypePDF, "output.pdf");

6.2 關(guān)閉Excel進(jìn)程與資源釋放

在C#應(yīng)用程序中,正確管理Excel進(jìn)程和釋放資源是防止內(nèi)存泄漏和資源占用的關(guān)鍵步驟。

安全關(guān)閉Excel進(jìn)程的必要性

Excel進(jìn)程應(yīng)當(dāng)在不再需要時(shí)及時(shí)關(guān)閉,以釋放占用的系統(tǒng)資源。在某些情況下,如未正確關(guān)閉,可能還會(huì)導(dǎo)致文件損壞或數(shù)據(jù)丟失。

使用IDisposable接口管理資源

在C#中,使用 IDisposable 接口可以確保資源被正確釋放。當(dāng)使用Interop服務(wù)操作Excel對(duì)象時(shí),應(yīng)當(dāng)實(shí)現(xiàn)該接口,確保即使發(fā)生異常,資源也能得到釋放。

public class ExcelInterop : IDisposable
{
    private Workbook workbook;
    private Application excelApp;

    public void Dispose()
    {
        if (workbook != null)
            workbook.Close(false);
        if (excelApp != null)
            excelApp.Quit();

        // 注意:這里不應(yīng)直接調(diào)用GC.Collect(),僅作為示例
        System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
        System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
        workbook = null;
        excelApp = null;
    }

    // 其他方法...
}

6.3 異常處理與資源清理最佳實(shí)踐

處理文件保存時(shí)可能會(huì)遇到的異常情況,并采用最佳實(shí)踐進(jìn)行資源清理,對(duì)于編寫(xiě)健壯的C#程序至關(guān)重要。

處理文件保存時(shí)的異常情況

在保存文件時(shí)可能會(huì)遇到權(quán)限問(wèn)題、磁盤(pán)空間不足等多種異常。應(yīng)當(dāng)通過(guò)異常處理邏輯來(lái)確保用戶(hù)得到適當(dāng)?shù)姆答仯⒉扇〈胧┗謴?fù)到安全狀態(tài)。

try
{
    // 嘗試保存Excel文件
}
catch (COMException ex)
{
    // 異常處理邏輯,例如:提示用戶(hù)檢查文件權(quán)限、磁盤(pán)空間等
}

資源清理的最佳實(shí)踐與代碼示例

資源清理的最佳實(shí)踐不僅包括釋放COM對(duì)象,還應(yīng)當(dāng)包括取消引用對(duì)象。這有助于垃圾收集器更快地回收對(duì)象占用的內(nèi)存。

// 示例代碼:實(shí)現(xiàn)IDisposable接口的清理方法
public void Dispose()
{
    Dispose(true);
    GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
    if (disposing)
    {
        // 釋放托管資源
    }
    // 釋放非托管資源
}

通過(guò)遵循上述章節(jié)中的步驟和最佳實(shí)踐,開(kāi)發(fā)者可以有效地管理Excel文件的保存和資源清理流程,確保應(yīng)用程序的健壯性和用戶(hù)體驗(yàn)。

以上就是C#實(shí)現(xiàn)導(dǎo)出數(shù)據(jù)到Excel的完整源碼指南的詳細(xì)內(nèi)容,更多關(guān)于C#數(shù)據(jù)導(dǎo)出到Excel的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C#委托與事件原理及實(shí)例解析

    C#委托與事件原理及實(shí)例解析

    這篇文章主要介紹了C#委托與事件原理及實(shí)例解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • C#實(shí)現(xiàn)將商品金額小寫(xiě)轉(zhuǎn)換成大寫(xiě)的方法

    C#實(shí)現(xiàn)將商品金額小寫(xiě)轉(zhuǎn)換成大寫(xiě)的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)將商品金額小寫(xiě)轉(zhuǎn)換成大寫(xiě)的方法,涉及C#數(shù)組與字符串的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • C#實(shí)現(xiàn)連接SQL Server2012數(shù)據(jù)庫(kù)并執(zhí)行SQL語(yǔ)句的方法

    C#實(shí)現(xiàn)連接SQL Server2012數(shù)據(jù)庫(kù)并執(zhí)行SQL語(yǔ)句的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)連接SQL Server2012數(shù)據(jù)庫(kù)并執(zhí)行SQL語(yǔ)句的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了C#連接SQL Server2012數(shù)據(jù)庫(kù)并執(zhí)行查詢(xún)、插入等操作的相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • C#使用winform簡(jiǎn)單導(dǎo)出Excel的方法

    C#使用winform簡(jiǎn)單導(dǎo)出Excel的方法

    這篇文章主要介紹了C#使用winform簡(jiǎn)單導(dǎo)出Excel的方法,結(jié)合實(shí)例形式分析了WinForm操作Excel文件的寫(xiě)入導(dǎo)出等相關(guān)技巧,需要的朋友可以參考下
    2016-06-06
  • 淺談C#六大設(shè)計(jì)原則

    淺談C#六大設(shè)計(jì)原則

    這篇文章主要介紹了C#六大設(shè)計(jì)原則的相關(guān)內(nèi)容,文中代碼非常細(xì)致,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • unity3d實(shí)現(xiàn)七天簽到功能

    unity3d實(shí)現(xiàn)七天簽到功能

    這篇文章主要為大家詳細(xì)介紹了unity3d實(shí)現(xiàn)七天簽到功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法

    C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法

    這篇文章主要介紹了C#實(shí)現(xiàn)最簡(jiǎn)單的文本加密方法,可實(shí)現(xiàn)簡(jiǎn)單的文本加密功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-12-12
  • c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法

    c# TreeView添加右鍵快鍵菜單有兩種方法,需要的朋友可以參考一下
    2013-04-04
  • C#沉淀之委托的深入講解

    C#沉淀之委托的深入講解

    如果要給方法傳遞一個(gè)方法參數(shù)時(shí),就可以使用委托。下面這篇文章主要給大家介紹了關(guān)于C#沉淀之委托的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • c# winform 解決PictureBox 無(wú)法打印全部圖片的問(wèn)題

    c# winform 解決PictureBox 無(wú)法打印全部圖片的問(wèn)題

    這篇文章主要介紹了c# winform 解決PictureBox 無(wú)法打印全部圖片的問(wèn)題,幫助大家更好進(jìn)行c# winform開(kāi)發(fā),感興趣的朋友可以了解下
    2020-12-12

最新評(píng)論

金川县| 招远市| 凤庆县| 定陶县| 花莲市| 南开区| 开鲁县| 利辛县| 承德县| 洛浦县| 旬阳县| 浮梁县| 乳山市| 麻城市| 新绛县| 昌宁县| 大英县| 柏乡县| 涿鹿县| 天气| 冕宁县| 辽宁省| 新蔡县| 沙河市| 博兴县| 临西县| 特克斯县| 牟定县| 赣榆县| 岐山县| 怀柔区| 和田市| 桐梓县| 绵阳市| 曲水县| 宜川县| 青海省| 双流县| 新郑市| 厦门市| 肃宁县|