程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 讀帶復選框的excel,寫excel並設置字體、邊框、背景色,

C# 讀帶復選框的excel,寫excel並設置字體、邊框、背景色,

編輯:C#入門知識

C# 讀帶復選框的excel,寫excel並設置字體、邊框、背景色,


這是一篇excel讀寫功能大匯總,通過C#調用Microsoft.Office.Interop.Excel.dll才能完成任何復雜格式excel的讀寫操作。

本文需要讀取的excel格式如下:

可見表格極不規則,且含有復選框等控件,現在需要將這種表格中的數據提取出來。

要求將提取出來的數據寫入到明細表結構的excel中,格式如:

這是我們常見的table表樣式,但需要操作excel的字體、背景顏色和邊框樣式。

為完成以上工作,我們先引用Microsoft.Office.Interop.Excel.dll控件:

程序中添加using引用:

using Excel = Microsoft.Office.Interop.Excel;

讀取復雜excel格式數據的代碼如下:

 private void GetData(string excelPath)
        {
            Excel.Application excelapp = new Excel.Application();
            Excel.Workbook wb = excelapp.Workbooks.Open(excelPath);
            Excel.Worksheet WS = (Excel.Worksheet)wb.Worksheets[1];
            Excel.CheckBoxes ckbs = (Excel.CheckBoxes)WS.CheckBoxes(Type.Missing);

            //讀取復選框的值
            //Excel.CheckBox cbt = (Excel.CheckBox)ckbs.Item(1);
            //MessageBox.Show(cbt.Value + " " + cbt.Caption);

            //讀取單元格的值
            //MessageBox.Show(WS.Cells.get_Range("C2").Value);

            //讀取excel數據到table中
            DataRow dr = resultDt.NewRow();
            dr.BeginEdit();
            dr["負責人"] = WS.Cells.get_Range("C2").Value;
            dr["所屬區域"] = WS.Cells.get_Range("G2").Value;
            dr["填寫時間"] = ((DateTime)WS.Cells.get_Range("K2").Value).ToShortDateString();
            dr["經銷商姓名"] = WS.Cells.get_Range("C3").Value;
            dr["手機"] = WS.Cells.get_Range("E3").Value;
            dr["辦公電話"] = WS.Cells.get_Range("H3").Value;
            dr["傳真"] = WS.Cells.get_Range("K3").Value;
            dr["商業公司"] = WS.Cells.get_Range("C4").Value;
            //讀取復選框的值
            dr["經銷商性質"] = getCheckString(new int[] { 5, 6 }, ckbs);
            dr["銷售渠道"] = getCheckString(new int[] { 7, 8, 9, 10 }, ckbs);
            dr["操作的主要區域"] = WS.Cells.get_Range("C6").Value;
            dr["分銷的主要區域"] = WS.Cells.get_Range("I6").Value;
            dr["操作的主要醫院"] = WS.Cells.get_Range("C7").Value;
            dr["經銷商資金實力"] = getCheckString(new int[] { 1, 2, 3, 4 }, ckbs);
            dr["同行的評價"] = WS.Cells.get_Range("C9").Value;
            dr["專職醫藥代表人數"] = WS.Cells.get_Range("D10").Value;
            dr["市場推廣專員人數"] = WS.Cells.get_Range("H10").Value;
            dr["銷售主管姓名"] = WS.Cells.get_Range("L10").Value;
            //合並既往銷售品種
            string hb = string.Empty;
            if (WS.Cells.get_Range("D11").Value!=null)
                hb = WS.Cells.get_Range("D11").Value + "/" + WS.Cells.get_Range("H11").Value + "/" + WS.Cells.get_Range("L11").Value;
            if (WS.Cells.get_Range("D12").Value!=null)
                hb += "、" + WS.Cells.get_Range("D12").Value + "/" + WS.Cells.get_Range("H12").Value + "/" + WS.Cells.get_Range("L12").Value;
            if (WS.Cells.get_Range("D13").Value!=null)
                hb += "、" + WS.Cells.get_Range("D13").Value + "/" + WS.Cells.get_Range("H13").Value + "/" + WS.Cells.get_Range("L13").Value;
            dr["既往銷售主要品種數量方式"] = hb;
            dr["銷售推廣的操作模式"] = WS.Cells.get_Range("D14").Value;
            dr["客戶強項關系"] = getCheckString(new int[] { 11, 12, 13, 14, 15, 16, 17 }, ckbs);
            dr["政府事務主要關系"] = WS.Cells.get_Range("D16").Value;
            dr.EndEdit();
            resultDt.Rows.Add(dr);

            //dataGridView1.DataSource = resultDt.DefaultView;

            wb.Close();
            excelapp.Quit();
        }

代碼中已經很清楚了,特別強調的是,讀取復選框的值比較麻煩一點,只有WS.CheckBoxes(Type.Missing)這個方法,直接得到excel中所有的checkbox,然後如何對應呢,如果checkbox是有text值,那還好一點,可以從text值來對應,如果復選框使用不規范,所有的復選框text屬性都是空,那就麻煩了。真不巧我就是遇到一個這樣的excel模板,於是先備份一份,然後在excel中把所有checkbox都添加上對應的text屬性,然後在程序中遍歷一下所有checkbox的index,這樣就把index和text對應上了,再使用原先的模板,也不會去錯值。

excel格式再復雜,我們要取的數據都會在一個個單元格裡面,只要我們用WS.Cells.get_Range("C2").Value方法取值,就可以取到任何單元格,任何復雜格式的數據。

然後我們現在來看寫操作,寫excel有很多種方法,但要想控制excel的字體、邊框、背景色等樣式,就還是得用Microsoft.Office.Interop.Excel來完成。

寫excel的代碼如下:

 string filesavePath = saveFileDialog1.FileName;
                Excel.Application excel = new Excel.Application();
                Excel.Workbook book = excel.Workbooks.Add(Type.Missing);
                Excel.Worksheet sheet = (Excel.Worksheet)book.ActiveSheet;
                // Adds table headers
                for(int i=0;i<resultDt.Columns.Count;i++)
                {
                    sheet.Cells[1, i + 1] = resultDt.Columns[i].ColumnName;
                    
                }
                sheet.Cells.get_Range("A1", "V1").Font.Bold = true; //設置字體為粗體
                sheet.Cells.get_Range("A1", "V1").Font.Size = 14; //設置字體大小
                sheet.Cells.get_Range("A1", "V1").EntireColumn.AutoFit();//自動調整列寬
                sheet.Cells.get_Range("A1", "V1").EntireRow.AutoFit();//自動調整行高
                sheet.Cells.get_Range("A1", "V1").Interior.Color = System.Drawing.ColorTranslator.ToOle(Color.Yellow);//設置背景色
                sheet.Cells.get_Range("A1", "V" + (resultDt.Rows.Count+1)).Borders.LineStyle = 1; //設置整個數據區邊框為實線


                for (int row = 0; row < resultDt.Rows.Count; row++)
                {
                    for (int col = 0; col < resultDt.Columns.Count; col++)
                    {
                        sheet.Cells[row + 2, col + 1] = resultDt.Rows[row][col].ToString();
                    }
                }

                book.Close(true, filesavePath, Type.Missing);
                excel.Quit();

                label2.Text = "已成功導出到文件:"+filesavePath;

 

源碼下載:

 


C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

C語言中->是什?

->是一個整體,它是用於指向結構體、C++中的class等含有子數據的指針用來取子數據。換種說法,如果我們在C語言中定義了一個結構體,然後申明一個指針指向這個結構體,那麼我們要用指針取出結構體中的數據,就要用到“->”.
舉個例子:
struct Data
{
int a,b,c;
}; /*定義結構體*/
struct Data * p;/*定義結構體指針*/
struct Data A = {1,2,3};/*聲明變量A*/
int x;/*聲明一個變量x*/
p = &A ; /*讓p指向A*/
x = p->a;/*這句話的意思就是取出p所指向的結構體中包含的數據項a賦值給x*/
/*由於此時p指向A,因而 p->a == A.a,也就是1*/

對於一開始的問題 p = p->next;這應該出現在C語言的鏈表,這裡的next應該是一個與p同類型的結構體指針,其定義格式應該是:
struct Data
{
int a;
struct Data * next;
};/*定義結構體*/
…………
main()
{
struct Data * p;/*聲明指針變量p*/
……
p = p->next;/*將next中的值賦給p*/
}
鏈表指針是C語言的一個難點,但也是重點,學懂了非常有用。要仔細講就必須先講變量、指針。
什麼是變量?所謂變量,不要淺顯的認為會變得量就是變量。套用我們院長的問話:“教室變不變?”變,因為每天有不同的人在裡面上課,但又不變,因為教室始終在那,沒有變大或變小。這就是變量:有一個不變的地址和一塊可變的存儲空間。正常情況下,我們只看到變量這個房間裡面的東西,也就是其內容,但不會關注變量的地址,但是C語言的指針,就是這個房間的地址。我們聲明變量就相當於蓋了間房子存放東西,我們可以直接觀看房子裡的東西,而聲明指針,就是相當於獲得了一個定位器,當用指針指向某個變量時,就是用指針給變量定位,以後我們就可以用指針找到他所“跟蹤”的變量並可以獲得裡面的內容。
那結構體呢?結構體就相當於是有好幾個房子組成的別墅,幾個房子綁定在一起使用。假設現在有很多這種別墅分布在一個大迷宮裡,每間別墅裡都有一間房子。裡面放了另一個別墅的位置信息,現在你手拿定位器找到了第一棟別墅,從裡面得到了你想要的東西(鏈表的數據部分),然後把下一棟別墅的位置計入你的定位器(p = p->next),再走向下一棟別墅……如此走下去,知道走到某地下一棟別墅信息沒有了(p->next == NULL),你的旅行結束。這就是鏈表一次遍歷的過程。現在你能明白 p=p->next的含義了吧!
寫了這麼多。希望你能明白。
如果想學好c和C++,鏈表和指針必須熟練掌握!
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved