版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 肺炎狀況課件教學(xué)課件
- 2024年度產(chǎn)品代理合同與物業(yè)費詳細構(gòu)成
- 課件腕關(guān)節(jié)教學(xué)課件
- 2024年乙方向甲方購買設(shè)備的購銷合同
- 2024年建筑信息模型(BIM)合作協(xié)議
- 2024年住宅買賣雙方合同
- 2024年度4S店租賃期內(nèi)客戶資料保密協(xié)議
- 制備氧氣課件教學(xué)課件
- 2024廣州房屋租賃合同范本2
- 【幼兒園語言文字教學(xué)的規(guī)范化分析3000字(論文)】
- 瓶口分液器校準(zhǔn)規(guī)范
- (完整版)醫(yī)療器械網(wǎng)絡(luò)交易服務(wù)第三方平臺質(zhì)量管理文件
- 信息管理監(jiān)理實施細則水利水電工程
- (醫(yī)學(xué)課件)DIC患者的護理
- 跨境數(shù)據(jù)流動的全球治理進展、趨勢與中國路徑
- 【多旋翼無人機的組裝與調(diào)試5600字(論文)】
- 2023年遼陽市宏偉區(qū)事業(yè)單位考試真題
- 環(huán)境工程專業(yè)英語 課件
- 繼電保護動作分析報告課件
- 五年級數(shù)學(xué)上冊8解方程課件
評論
0/150
提交評論