C#操作Excel開發(fā)報表系列整理_第1頁
C#操作Excel開發(fā)報表系列整理_第2頁
C#操作Excel開發(fā)報表系列整理_第3頁
C#操作Excel開發(fā)報表系列整理_第4頁
C#操作Excel開發(fā)報表系列整理_第5頁
已閱讀5頁,還剩26頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

C#操作Excel進行報表開發(fā)系列共寫了八篇,也已經(jīng)有很久沒有新東西了,現(xiàn)在整理一下,方便以后查閱,如果有寫新的,會同時更新。

需要注意的是因為Office的版本不同,實際的代碼可能會有所不同,但是都是多幾個,少幾個參數(shù),補上參數(shù)就可以了

將Excel應(yīng)用于報表開發(fā)中(一)--開始

使用C#和Excel進行報表開發(fā)(二)-操作統(tǒng)計圖(Chart)

使用C#和Excel進行報表開發(fā)(三)-生成統(tǒng)計圖(Chart)

使用C#和Excel進行報表開發(fā)(四)-復(fù)制單元格

使用C#和Excel進行報表開發(fā)(五)-操作單元格邊框和顏色

使用C#和Excel進行報表開發(fā)(六)-操作行和列

使用C#和Excel進行報表開發(fā)(七)-設(shè)置單元格的顯示格式

4月12日新增

使用C#和Excel進行報表開發(fā)(八)-用程序綁定數(shù)據(jù)源將Excel應(yīng)用于報表開發(fā)中(一)--開始Postedon2006-11-2718:31Cure閱讀(8507)評論(12)

編輯收藏所屬分類:報表應(yīng)用,.Net開發(fā)目前的商業(yè)工具如水晶報表,ActiveReport等,都提供了靈活,強大的功能,但是對于比較特殊化的表格,特別是國內(nèi)的一些應(yīng)用,都是一個個的格子組成的,這樣要是用線來一根根畫就比較麻煩,但是這類工具還都不提供表格化的報表布局定義方式。一個很好的選擇是VS2005的客戶端報表(RDLC),但是在某幾個方面還是不夠靈活,例如,靈活性有限制,要想自己編碼實現(xiàn)一些復(fù)雜邏輯還是有困難;要VS2005,對于一些還在使用VS2003的項目就只有眼饞的份了。用Excel來實現(xiàn),優(yōu)點在于頁面布局設(shè)計靈活,同時使用代碼來操作數(shù)據(jù)要更靈活,更精確。下面是一個簡單的例子,打開一個定義好的Excel文件,這個文件是作為報表的模板,然后向模板的指定格子里填充數(shù)據(jù),形成一個報表,在web方式下可以按照指定的命名方式在服務(wù)器上生成一個excel文件,之后傳送到客戶端,由客戶端啟動excel進行打印。

Excel.Applicationm_objExcel=null;Excel._Workbookm_objBook=null;Excel.Sheetsm_objSheets=null;Excel._Worksheetm_objSheet=null;Excel.Rangem_objRange=null; objectm_objOpt=System.Reflection.Missing.Value;try{ m_objExcel=newExcel.Application();m_objBook=m_objExcel.Workbooks.Open("z:\\Book1.xls",m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt);

m_objSheets=(Excel.Sheets)m_objBook.Worksheets; m_objSheet=(Excel._Worksheet)(m_objSheets.get_Item(1));

string[]info=newstring[5]{"Cure","26","","漢","按時?放奧斯丁奧斯丁非是否奧斯丁非"}; m_objRange=m_objSheet.get_Range("B1",m_objOpt); m_objRange.Value=info[0]; m_objRange=m_objSheet.get_Range("E1",m_objOpt); m_objRange.Value=info[1]; m_objRange=m_objSheet.get_Range("B2",m_objOpt); m_objRange.Value=info[2]; m_objRange=m_objSheet.get_Range("E2",m_objOpt); m_objRange.Value=info[3]; m_objRange=m_objSheet.get_Range("A3",m_objOpt); m_objRange.Value=info[4]; m_objExcel.DisplayAlerts=false;

m_objBook.SaveAs("z:\\Book2.xls",m_objOpt,m_objOpt, m_objOpt,m_objOpt,m_objOpt,Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt,m_objOpt,m_objOpt,m_objOpt);

}catch(Exceptionex){ MessageBox.Show(ex.Message);}finally{ m_objBook.Close(m_objOpt,m_objOpt,m_objOpt); m_objExcel.Workbooks.Close(); m_objExcel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel); m_objBook=null; m_objExcel=null; GC.Collect();}

可以看到,使用Excel要進行一部分的編碼,好在這部分還不太復(fù)雜,但是最大的問題就在于當(dāng)報表需求變更時,要重新編譯部署,而且當(dāng)格子特別多的時候,要這樣硬編碼還是挺痛苦的一件事。不過使用Excel畢竟給我們提供了一種選擇,可以在開發(fā)時對多種方案權(quán)衡利弊,使用最適合項目的。使用C#和Excel進行報表開發(fā)(二)-操作統(tǒng)計圖(Chart)Postedon2006-11-2818:48Cure閱讀(7995)評論(17)

編輯收藏所屬分類:報表應(yīng)用下面的代碼使用一個現(xiàn)有的統(tǒng)計圖Excel文件,加載這個文件,設(shè)置某一項的值和統(tǒng)計圖的表示方式,然后保存到另一個Excel文件里。如果是VS2005+Office2003,也可以選擇使用VisualStudioToolsforOffice來作。Excel.Applicationm_objExcel=null;Excel._Workbookm_objBook=null;Excel._Chartm_objChart=null;Excel.ChartGroupm_objChartGroup=null;Excel.Seriesm_objSeries=null;objectm_objOpt=System.Reflection.Missing.Value;try{ m_objExcel=newExcel.Application(); m_objBook=m_objExcel.Workbooks.Open("z:\\Book11.xls",m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt,m_objOpt); m_objChart=(Excel._Chart)m_objExcel.Charts.get_Item(1); m_objChart.BarShape=Excel.XlBarShape.xlCylinder; m_objChartGroup=(Excel.ChartGroup)m_objChart.ChartGroups(1); m_objSeries=(Excel.Series)m_objChartGroup.SeriesCollection(1); m_objSeries.Values=456; m_objExcel.DisplayAlerts=false;

m_objBook.SaveAs("z:\\Book2.xls",m_objOpt,m_objOpt, m_objOpt,m_objOpt,m_objOpt,Excel.XlSaveAsAccessMode.xlNoChange, m_objOpt,m_objOpt,m_objOpt,m_objOpt);

}catch(Exceptionex){ MessageBox.Show(ex.Message);}finally{ m_objBook.Close(m_objOpt,m_objOpt,m_objOpt); m_objExcel.Workbooks.Close();

m_objExcel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook); System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel); m_objBook=null; m_objExcel=null; GC.Collect(); this.Close();}

源Excel文件中的統(tǒng)計圖:

經(jīng)過代碼處理后保存的統(tǒng)計圖:

使用C#和Excel進行報表開發(fā)(三)-生成統(tǒng)計圖(Chart)Postedon2006-12-2016:28Cure閱讀(10432)評論(13)

編輯收藏所屬分類:報表應(yīng)用,.Net開發(fā)有的Web項目選用Excel作為報表方案,在服務(wù)器端生成Excel文件,然后傳送到客戶端,由客戶端進行打印。在國內(nèi)的環(huán)境下,相對PDF方式,Excel的安裝率應(yīng)該比pdf閱讀器的安裝率要高,同時,微軟也為C#操作Excel提供了完備的接口,雖然ZedGraph和其他的商業(yè)報表工具生成的統(tǒng)計圖也很好,但是人家微軟畢竟是大品牌,值得信賴。本文介紹使用C#調(diào)用Excel來生成統(tǒng)計圖(Chart)的以及Chart圖中各部分控制的一些方法。

在上一篇使用C#和Excel進行報表開發(fā)(二)-操作統(tǒng)計圖(Chart)中,我們使用一個預(yù)定義的Excel文件,通過改變Chart中的某個值來生成統(tǒng)計圖。本文進一步演示如何從指定的數(shù)據(jù)從頭生成統(tǒng)計圖。

首先當(dāng)然要添加對Excel的引用,然后需要定義幾個要用到的Excel對象:Excel.ApplicationThisApplication=null;Excel.Workbooksm_objBooks=null;Excel._WorkbookThisWorkbook=null;Excel.WorksheetxlSheet=null;

在創(chuàng)建一個新的_WorkBook對象的時候,默認的會含有3個Sheet,所以為了顯示清晰,將多余的Sheet都刪掉:privatevoidDeleteSheet(){ foreach(Excel.WorksheetwsinThisWorkbook.Worksheets) if(ws!=ThisApplication.ActiveSheet) { ws.Delete(); } foreach(Excel.ChartchtinThisWorkbook.Charts) cht.Delete(); }

再下來需要添加用來給Chart提供數(shù)據(jù)的Sheet:privatevoidAddDatasheet(){ xlSheet=(Excel.Worksheet)ThisWorkbook. Worksheets.Add(Type.Missing,ThisWorkbook.ActiveSheet, Type.Missing,Type.Missing);

xlSheet.Name="數(shù)據(jù)";}

生成Chart用到的數(shù)據(jù),因為是演示,所以這里使用生成隨機數(shù)的方法來替代從數(shù)據(jù)庫中提取數(shù)據(jù)。privatevoidLoadData(){ Randomran=newRandom(); for(inti=1;i<=12;i++) { xlSheet.Cells[i,1]=i.ToString()+"月"; xlSheet.Cells[i,2]=ran.Next(2000).ToString(); }}

好了,到此,準(zhǔn)備工作全部已經(jīng)就緒,下面要進行Chart的生成設(shè)置部分了:生成一個統(tǒng)計圖對象:Excel.ChartxlChart=(Excel.Chart)ThisWorkbook.Charts. Add(Type.Missing,xlSheet,Type.Missing,Type.Missing);

設(shè)定數(shù)據(jù)來源:Excel.RangecellRange=(Excel.Range)xlSheet.Cells[1,1];

通過向?qū)蒀hart:xlChart.ChartWizard(cellRange.CurrentRegion, Excel.XlChartType.xl3DColumn,Type.Missing, Excel.XlRowCol.xlColumns,1,0,true, "訪問量比較()","月份","訪問量", "");

到此,Chart的生成就完成了,貌似比較簡單,下面我們對其作一些設(shè)置,好更漂亮些。設(shè)置統(tǒng)計圖Sheet的名稱:xlChart.Name="統(tǒng)計";

現(xiàn)在的統(tǒng)計圖只有一個組,他們會顯示成一樣的顏色,我們來讓12個Bar都顯示不同的顏色:Excel.ChartGroupgrp=(Excel.ChartGroup)xlChart.ChartGroups(1);grp.GapWidth=20;grp.VaryByCategories=true;

現(xiàn)在Chart的條目的顯示形狀是Box,我們讓它們變成圓柱形,并給它們顯示加上數(shù)據(jù)標(biāo)簽:Excel.Seriess=(Excel.Series)grp.SeriesCollection(1);s.BarShape=XlBarShape.xlCylinder;s.HasDataLabels=true;

下面再來設(shè)置統(tǒng)計圖的標(biāo)題和圖例的顯示:xlChart.Legend.Position=XlLegendPosition.xlLegendPositionTop;xlChart.ChartTitle.Font.Size=24;xlChart.ChartTitle.Shadow=true;xlChart.ChartTitle.Border.LineStyle=Excel.XlLineStyle.xlContinuous;

最后設(shè)置兩個軸的屬性,Excel.XlAxisType.xlValue對應(yīng)的是Y軸,Excel.XlAxisType.xlCategory對應(yīng)的是X軸:Excel.AxisvalueAxis=(Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue,XlAxisGroup.xlPrimary);valueAxis.AxisTitle.Orientation=-90;

Excel.AxiscategoryAxis=(Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory,XlAxisGroup.xlPrimary);categoryAxis.AxisTitle.Font.Name="MSUIGothic";

到此,一切就緒了,下面要生成Chart,并將其存為一個Excel文件:

try

{

ThisApplication

=

new

Excel.Application();

m_objBooks

=

(Excel.Workbooks)ThisApplication.Workbooks;

ThisWorkbook

=

(Excel._Workbook)(m_objBooks.Add(Type.Missing));

ThisApplication.DisplayAlerts

=

false;

this.DeleteSheet();

this.AddDatasheet();

this.LoadData();

CreateChart();

ThisWorkbook.SaveAs("z:\\Book2.xls",

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing,

Excel.XlSaveAsAccessMode.xlNoChange,

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing);

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

finally

{

ThisWorkbook.Close(Type.Missing,

Type.Missing,

Type.Missing);

ThisApplication.Workbooks.Close();

ThisApplication.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorkbook);

System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisApplication);

ThisWorkbook

=

null;

ThisApplication

=

null;

GC.Collect();

this.Close();

}

運行你的程序,打開生成的Excel文件,最終生成的Chart應(yīng)該像這樣:

完成了Chart的生成,但是上面對于每個月只有一項數(shù)據(jù),如果我想顯示多項呢,例如顯示每個月兩個頁面的范圍量的對比。方法很簡單,只要再多生成一組數(shù)據(jù)就可以了,我們修改下LoadData方法:privatevoidLoadData(){ Randomran=newRandom(); for(inti=1;i<=12;i++) { xlSheet.Cells[i,1]=i.ToString()+"月"; xlSheet.Cells[i,2]=ran.Next(2000).ToString();xlSheet.Cells[i,3]=ran.Next(1500).ToString(); }}再次運行程序,生成Chart看看,應(yīng)該像下面的效果:

可以看到,兩組數(shù)據(jù)以不同的形狀顯示,同時,圖例部分也不再顯示1-12月共12項,而是顯示兩項,這是因為在上面的代碼中我們設(shè)置了ChartGroup的VaryByCategories屬性:grp.VaryByCategories=true;當(dāng)我們有兩個以上的組時,這一項就失效了。

在用C#操作Excel的時候,恐怕最大的困難就在于不知道Excel提供的各個對象,以及它們的屬性,方法等信息,好在MSDN里有關(guān)于Excel的接口說明-ExcelPrimaryInteropAssemblyReference,參照這些,相信很快就能上手了。

最后是完整代碼:

private

void

button4_Click(object

sender,

EventArgs

e)

{

try

{

ThisApplication

=

new

Excel.Application();

m_objBooks

=

(Excel.Workbooks)ThisApplication.Workbooks;

ThisWorkbook

=

(Excel._Workbook)(m_objBooks.Add(Type.Missing));

ThisApplication.DisplayAlerts

=

false;

this.DeleteSheet();

this.AddDatasheet();

this.LoadData();

CreateChart();

ThisWorkbook.SaveAs("z:\\Book2.xls",

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing,

Excel.XlSaveAsAccessMode.xlNoChange,

Type.Missing,

Type.Missing,

Type.Missing,

Type.Missing);

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

finally

{

ThisWorkbook.Close(Type.Missing,

Type.Missing,

Type.Missing);

ThisApplication.Workbooks.Close();

ThisApplication.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorkbook);

System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisApplication);

ThisWorkbook

=

null;

ThisApplication

=

null;

GC.Collect();

this.Close();

}

}

Excel.Application

ThisApplication

=

null;

Excel.Workbooks

m_objBooks

=

null;

Excel._Workbook

ThisWorkbook

=

null;

Excel.Worksheet

xlSheet

=

null;

///

<summary>

///

用生成的隨機數(shù)作數(shù)據(jù)

///

</summary>

private

void

LoadData()

{

Random

ran

=

new

Random();

for

(int

i

=

1;

i

<=

12;

i++)

{

xlSheet.Cells[i,

1]

=

i.ToString()

+

"月";

xlSheet.Cells[i,

2]

=

ran.Next(2000).ToString();

}

}

///

<summary>

///

刪除多余的Sheet

///

</summary>

private

void

DeleteSheet()

{

foreach

(Excel.Worksheet

ws

in

ThisWorkbook.Worksheets)

if

(ws

!=

ThisApplication.ActiveSheet)

{

ws.Delete();

}

foreach

(Excel.Chart

cht

in

ThisWorkbook.Charts)

cht.Delete();

}

///

<summary>

///

創(chuàng)建一個Sheet,用來存數(shù)據(jù)

///

</summary>

private

void

AddDatasheet()

{

xlSheet

=

(Excel.Worksheet)ThisWorkbook.

Worksheets.Add(Type.Missing,

ThisWorkbook.ActiveSheet,

Type.Missing,

Type.Missing);

xlSheet.Name

=

"數(shù)據(jù)";

}

///

<summary>

///

創(chuàng)建統(tǒng)計圖

///

</summary>

private

void

CreateChart()

{

Excel.Chart

xlChart

=

(Excel.Chart)ThisWorkbook.Charts.

Add(Type.Missing,

xlSheet,

Type.Missing,

Type.Missing);

Excel.Range

cellRange

=

(Excel.Range)xlSheet.Cells[1,

1];

xlChart.ChartWizard(cellRange.CurrentRegion,

Excel.XlChartType.xl3DColumn,

Type.Missing,

Excel.XlRowCol.xlColumns,1,

0,

true

,

"訪問量比較()",

"月份",

"訪問量",

"");

xlChart.Name

=

"統(tǒng)計";

Excel.ChartGroup

grp

=

(Excel.ChartGroup)xlChart.ChartGroups(1);

grp.GapWidth

=

20;

grp.VaryByCategories

=

true;

Excel.Series

s

=

(Excel.Series)grp.SeriesCollection(1);

s.BarShape

=

XlBarShape.xlCylinder;

s.HasDataLabels

=

true;

xlChart.Legend.Position

=

XlLegendPosition.xlLegendPositionTop;

xlChart.ChartTitle.Font.Size

=

24;

xlChart.ChartTitle.Shadow

=

true;

xlChart.ChartTitle.Border.LineStyle

=

Excel.XlLineStyle.xlContinuous;

Excel.Axis

valueAxis

=

(Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlValue,

XlAxisGroup.xlPrimary);

valueAxis.AxisTitle.Orientation

=

-90;

Excel.Axis

categoryAxis

=

(Excel.Axis)xlChart.Axes(Excel.XlAxisType.xlCategory,

XlAxisGroup.xlPrimary);

categoryAxis.AxisTitle.Font.Name

=

"MS

UI

Gothic";

}

00(請您對文章做出評價)使用C#和Excel進行報表開發(fā)(四)-復(fù)制單元格Postedon2006-12-2212:55Cure閱讀(3892)評論(3)

編輯收藏所屬分類:報表應(yīng)用在用Excel作報表的時候,可能會碰到分頁的情況,這樣就要分成多個Sheet顯示,如果要在每頁都保留表頭,就需要將第一頁作為模板設(shè)計的表頭部分拷貝到其他的Sheet上,這時就要用用到Excel中的單元格拷貝。下面的代碼說明如何一個Sheet上的選定內(nèi)容拷貝到另一個Sheet上:

ThisApplication=newExcel.Application(); ThisWorkbook=ThisApplication.Workbooks.Open("z:\\Book1.xls",Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing); ThisApplication.DisplayAlerts=false; xlSheet=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(1); Excel.Rangerange=xlSheet.get_Range("A1",Type.Missing); range.Value="123"; Excel.Worksheetsheet1=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(2); Excel.Rangerange1=sheet1.get_Range("B1",Type.Missing); range.Copy(range1); ThisWorkbook.SaveAs("z:\\Book2.xls",Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,Type.Missing,Type.Missing,Type.Missing);

可以看到,核心的代碼是很簡單的,就是選定一個源區(qū)域,然后指定另一個目標(biāo)區(qū)域,調(diào)用源區(qū)域的Copy方法將內(nèi)容整個復(fù)制到目標(biāo)區(qū)域,但是你會發(fā)現(xiàn)是連單元格的格式等屬性一并拷貝過去的,如果要只拷貝單元格中的文本呢?那就要用到windows剪貼板了:xlSheet=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(1);Excel.Rangerange=xlSheet.get_Range("A1",Type.Missing);range.Value="123";System.Windows.Forms.Clipboard.SetDataObject(range.Value.ToString());Excel.Worksheetsheet1=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(2);Excel.Rangerange1=sheet1.get_Range("B1",Type.Missing);sheet1.Paste(range1,false);要注意的是,這種方式只能選一個單元格,復(fù)制一個,不能選定一批單元格進行復(fù)制。

上面的例子只給出了主要部分的代碼,其他的像銷毀Excel進程等操作請參考前面的幾篇Excel作報表的隨筆。使用C#和Excel進行報表開發(fā)(五)-操作單元格邊框和顏色Postedon2007-01-0815:24Cure閱讀(4018)評論(4)

編輯收藏所屬分類:報表應(yīng)用在用Excel作報表的時候,可能需要操作單元格的邊框和填充顏色和紋理等操作,下面的代碼說明如何設(shè)置選中的單元格的填充紋理和邊框

try{ ThisApplication=newExcel.Application();

ThisWorkbook=ThisApplication.Workbooks.Open("z:\\Book1.xls",Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);

ThisApplication.DisplayAlerts=false; xlSheet=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(1); Excel.Rangerange=xlSheet.get_Range("G4","H5"); range.Value="123"; Excel.Stylest=ThisWorkbook.Styles.Add("PropertyBorder",Type.Missing); range.Interior.Pattern=Excel.XlPattern.xlPatternCrissCross; range.Borders.Weight=2; range.Borders.get_Item(XlBordersIndex.xlEdgeRight).LineStyle=Excel.XlLineStyle.xlContinuous; range.Borders.get_Item(XlBordersIndex.xlEdgeBottom).LineStyle=Excel.XlLineStyle.xlContinuous; range.Borders.get_Item(XlBordersIndex.xlEdgeTop).LineStyle=Excel.XlLineStyle.xlContinuous; range.Borders.get_Item(XlBordersIndex.xlDiagonalDown).LineStyle=Excel.XlLineStyle.xlLineStyleNone; range.Borders.get_Item(XlBordersIndex.xlDiagonalUp).LineStyle=Excel.XlLineStyle.xlLineStyleNone; range.Borders.get_Item(XlBordersIndex.xlInsideHorizontal).LineStyle=Excel.XlLineStyle.xlLineStyleNone; range.Borders.get_Item(XlBordersIndex.xlInsideVertical).LineStyle=Excel.XlLineStyle.xlLineStyleNone; range.Borders.get_Item(XlBordersIndex.xlEdgeLeft).LineStyle=Excel.XlLineStyle.xlDot; range.Borders.get_Item(XlBordersIndex.xlEdgeLeft).Color=System.Drawing.ColorTranslator.ToOle(Color.Red); ThisWorkbook.SaveAs("z:\\Book2.xls",Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,Type.Missing,Type.Missing,Type.Missing);}catch(Exceptionex){ MessageBox.Show(ex.Message);}finally{ ThisWorkbook.Close(Type.Missing,Type.Missing,Type.Missing); ThisApplication.Workbooks.Close();

ThisApplication.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisWorkbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(ThisApplication); ThisWorkbook=null; ThisApplication=null; GC.Collect(); this.Close();}使用C#和Excel進行報表開發(fā)(六)-操作行和列Postedon2007-01-1014:35Cure閱讀(4266)評論(4)

編輯收藏所屬分類:C#代碼與實例,報表應(yīng)用在Excel中,行和列實際上仍然是Range,只不過取得行和列的方法和前面幾篇隨筆出現(xiàn)的有點不同,要使用Worksheet的Rows和Columns屬性的get_Item方法,下面是例子代碼,演示了怎樣選中行,并且在行之間復(fù)制數(shù)據(jù),和插入行:

ThisApplication=newExcel.Application();

ThisWorkbook=ThisApplication.Workbooks.Open("z:\\Book1.xls",Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing);

ThisApplication.DisplayAlerts=false;xlSheet=(Excel.Worksheet)ThisWorkbook.Worksheets.get_Item(1);//Excel.Rangerange=xlSheet.get_Range("G4",Type.Missing);Excel.Rangerange=(Excel.Range)xlSheet.Rows.get_Item(18,Type.Missing);Excel.Rangerange1=(Excel.Range)xlSheet.Rows.get_Item(19,Type.Missing);range.Value="123";range.Copy(range1);range1.Rows.Insert(XlInsertShiftDirection.xlShiftDown); ThisWorkbook.SaveAs("z:\\Book2.xls",Type.Missing,Type.Missing, Type.Missing,Type.Missing,Type.Missing,Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,Type.Missing,Type.Missing,Type.Missing);

關(guān)于Excel進程的釋放,前面幾篇隨筆已經(jīng)有了,這里就不再重復(fù)了。使用C#和Excel進行報表開發(fā)(七)-設(shè)置單元格的顯示格式Postedon2007-03-2614:27Cure閱讀(3880)評論(7)

編輯收藏所屬分類:報表應(yīng)用在Excel中,如果某個單元格的內(nèi)容是數(shù)字,且比較長,默認情況下,會變?yōu)榭茖W(xué)計數(shù)發(fā)表示,例如:會被表示為1.2345E+17,為了能夠?qū)?shù)字按照普通的格式完全表示,就需要設(shè)置單元格的屬性,下面是例子代碼:Excel.Application

m_objExcel

=

null;

Excel._Workbook

m_objBook

=

null;

Excel.Sheets

m_objSheets

=

null;

Excel._Worksheet

m_objSheet

=

null;

Excel.Range

m_objRange

=

null;

object

m_objOpt

=

System.Reflection.Missing.Value;

try

{

m_objExcel

=

new

Excel.Application();

m_objBook

=

m_objExcel.Workbooks.Open("e:\\1.xls",

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt);

m_objSheets

=

(Excel.Sheets)m_objBook.Worksheets;

m_objSheet

=

(Excel._Worksheet)(m_objSheets.get_Item(1));

m_objRange

=

m_objSheet.get_Range("A1",

m_objOpt);

m_objRange.NumberFormatLocal

=

"#";

m_objBook.SaveAs("e:\\22.xls",

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

Excel.XlSaveAsAccessMode.xlNoChange,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt);

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

finally

{

m_objBook.Close(m_objOpt,

m_objOpt,

m_objOpt);

m_objExcel.Workbooks.Close();

m_objExcel.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);

m_objBook

=

null;

m_objExcel

=

null;

GC.Collect();

}使用C#和Excel進行報表開發(fā)(八)-用程序綁定數(shù)據(jù)源Postedon2007-04-1212:32Cure閱讀(7883)評論(31)

編輯收藏所屬分類:報表應(yīng)用,C#代碼與實例本文演示一個簡單的辦法,并使用程序?qū)⒁粋€dataset中的內(nèi)容填充到指定的格子中,目的是盡可能的通用,從而避免C#代碼必須知道Excel文件中字段和內(nèi)容的位置的情況。

先制作一個簡單的Excel文件作為模板,為了防止要填充的Cell中的內(nèi)容和標(biāo)題的內(nèi)容一樣,所以要填充內(nèi)容的Cell中的內(nèi)容是“$”+字段名(要和DataTable中的列名一致),效果如圖:

創(chuàng)建一個Winform程序,給窗體上添加兩個按鈕,代碼分別為:

創(chuàng)建Xml:private

void

button1_Click(object

sender,

EventArgs

e)

{

DataColumn

dcName

=

new

DataColumn("name",

typeof(string));

DataColumn

dcAge

=

new

DataColumn("age",

typeof(int));

DataColumn

dcMemo

=

new

DataColumn("memo",

typeof(string));

DataTable

dt

=

new

DataTable();

dt.Columns.Add(dcName);

dt.Columns.Add(dcAge);

dt.Columns.Add(dcMemo);

DataRow

dr

=

dt.NewRow();

dr["name"]

=

"dahuzizyd";

dr["age"]

=

"20";

dr["memo"]

=

"";

dt.Rows.Add(dr);

dt.AcceptChanges();

DataSet

ds

=

new

DataSet();

ds.Tables.Add(dt);

ds.WriteXml(Application.StartupPath

+"\\ExcelBindingXml.xml");

}

提取xml并且加載到Excel模板上,再另存:

private

void

button2_Click(object

sender,

EventArgs

e)

{

DataSet

ds

=

new

DataSet();

ds.ReadXml(Application.StartupPath

+

"\\ExcelBindingXml.xml");

Excel.Application

m_objExcel

=

null;

Excel._Workbook

m_objBook

=

null;

Excel.Sheets

m_objSheets

=

null;

Excel._Worksheet

m_objSheet

=

null;

Excel.Range

m_objRange

=

null;

object

m_objOpt

=

System.Reflection.Missing.Value;

try

{

m_objExcel

=

new

Excel.Application();

m_objBook

=

m_objExcel.Workbooks.Open(Application.StartupPath

+

"\\ExcelTemplate.xls",

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt);

m_objSheets

=

(Excel.Sheets)m_objBook.Worksheets;

m_objSheet

=

(Excel._Worksheet)(m_objSheets.get_Item(1));

foreach

(DataRow

dr

in

ds.Tables[0].Rows)

{

for

(int

col

=

0;

col

<

ds.Tables[0].Columns.Count;

col++)

{

for

(int

excelcol

=

1;

excelcol

<

8;

excelcol++)

{

for

(int

excelrow

=

1;

excelrow

<

5;

excelrow++)

{

string

excelColName

=

ExcelColNumberToColText(excelcol);

m_objRange

=

m_objSheet.get_Range(excelColName

+

excelrow.ToString(),

m_objOpt);

if

(

m_objRange.Text.ToString().Replace("$","")

==

ds.Tables[0].Columns[col].ColumnName

)

{

m_objRange.Value2

=

dr[col].ToString();

}

}

}

}

}

m_objExcel.DisplayAlerts

=

false;

m_objBook.SaveAs(Application.StartupPath

+

"\\ExcelBindingXml.xls",

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

Excel.XlSaveAsAccessMode.xlNoChange,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt,

m_objOpt);

}

catch

(Exception

ex)

{

MessageBox.Show(ex.Message);

}

finally

{

m_objBook.Close(m_objOpt,

m_objOpt,

m_objOpt);

m_objExcel.Workbooks.Close();

m_objExcel.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objBook);

System.Runtime.InteropServices.Marshal.ReleaseComObject(m_objExcel);

m_objBook

=

null;

m_objExcel

=

null;

GC.Collect();

}

}

下面是一個輔助函數(shù),主要是將整數(shù)的列序號轉(zhuǎn)換到Excel用的以字母表示的列號,Excel最大列數(shù)為255。private

string

ExcelColNumberToColText(int

colNumber)

{

string

colText

=

"";

int

colTextLength

=

colNumber

/

26;

int

colTextLast

=

colNumber

%

26;

if

(colTextLast

!=

0)

{

switch

(colTextLength)

{

case

0:

break;

case

1:

colText

=

"A";

break;

case

2:

colText

=

"B";

break;

case

3:

colText

=

"C";

break;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論