1. 程式人生 > >PageOffice動態填充Excel文件

PageOffice動態填充Excel文件

PageOffice封裝了一組用於動態輸出資料到Excel文件的相關類,全部包含在PageOffice.ExcelWriter 名稱空間之中。PageOffice對Excel的賦值操作分兩種方式:

  1. 單元格賦值。這個很好理解, sheet.OpenCell("D5"),返回值就是一個Cell物件;

  2. 針對一個區域賦值。這個區域在PageOffice的概念裡就是Table物件,比如:sheet.OpenTable("C9:H15")的返回值就是就是Table物件,這個Table就是”C9:H15”這個區域。下面就針對這兩種操作方式來分別介紹。

一、給Excel單元格賦值

JAVA程式碼:

	Workbook wb = new Workbook();
	Sheet sheet = wb.openSheet("銷售訂單");
	sheet.openCell("D5").setValue(“北京某某公司”);
    
	PageOfficeCtrl poCtrl1 = new PageOfficeCtrl(request);
	poCtrl1.setServerPage("poserver.do"); 
	poCtrl1.setWriter(wb); //注意,不要忘記此句程式碼
	poCtrl1.webOpen("{模板檔案路徑}", OpenModeType.xlsSubmitForm, "");

ASP.NET程式碼:

	PageOffice.ExcelWriter.Workbook workBook = new PageOffice.ExcelWriter.Workbook();
	PageOffice.ExcelWriter.Sheet sheet = workBook.OpenSheet("銷售訂單");
	sheet.OpenCell("D5").Value = ”北京某某公司”;
    
	PageOfficeCtrl1.SetWriter(workBook); //注意,不要忘記此句程式碼
	PageOfficeCtrl1.ServerPage = "pageoffice/server.aspx";
	PageOfficeCtrl1.WebOpen("{模板檔案路徑}", PageOffice.OpenModeType.xlsSubmitForm, "John");

通過上面的程式碼可以看出,給Excel單元格賦值,首先需要建立Workbook物件,然後通過此物件的OpenSheet方法,獲取到Sheet物件,再通過Sheet物件的OpenCell方法就可以獲取的Cell物件,進行賦值或其他操作。 Sheet物件有兩個方法可以獲取到Cell物件:

  • OpenCell(string CellAddress),引數為單元格引用字串。例如:"A1";
  • OpenCellRC(int Row,int Col),引數為excel單元格的行數和列數。所以上面給Excel單元格賦值的程式碼改成下面的程式碼也是可以的。

JAVA程式碼:

sheet.openCellRC(5,4).setValue("北京某某公司");

ASP.NET程式碼:

sheet.OpenCellRC(5,4).Value = "北京某某公司";

設定Cell的樣式

PageOffice中的Cell物件有很多個設定單元格樣式的屬性和物件,如下表所示:

名稱 說明
BackColor 設定單元格的背景色。
Border 獲取邊框物件。
Font 獲取字型字型。
ForeColor 設定單元格的前景色。
Formula 設定單元格的公式。
HorizontalAlignment 設定單元格的水平對齊方式。
NumberFormatLocal 設定單元格的資料顯示格式。
Value 設定單元格的值。
VerticalAlignment 設定單元格的垂直對齊方式。
  • 設定單元格的背景色

JAVA程式碼:

Workbook wb = new Workbook();
wb.openSheet("Sheet1").openCell("E16").setBackColor(new Color(0, 128, 128));

ASP.NET程式碼:

PageOffice.ExcelWriter.Workbook workBook = new PageOffice.ExcelWriter.Workbook();
wb.OpenSheet("Sheet1").OpenCell("E16").BackColor = Color.FromArgb(0, 128, 128);
  • 設定單元格的字型,就需要操作Font物件進行設定。Font物件的屬性:
名稱 說明
Bold 設定字型是否加粗。
Italic 設定字型是否為斜體。
Name 設定字型名稱。
Size 設定字型大小。以磅為單位。
  • 設定單元格的邊框樣式,就需要操作Border物件進行設定。Border物件的屬性:
名稱 說明
BorderType 設定邊框的型別。
LineColor 設定邊框的顏色。
LineStyle 設定邊框的線條樣式。
Weight 設定邊框的粗細。

使用Border物件設定Excel的單元格樣式,是可以分別對單元格的上下左右邊框單獨設定樣式的,所以再複雜的表格樣式用PageOffice也可以“繪製”出來。PageOffice中的Table物件可以設定Table的Border樣式,所以在此不作詳細的敘述。

二、給Excel中的Table賦值

PageOffice開發平臺中,針對Excel檔案的處理增加了一個“Table”的概念,一個Table指的就是一個區域,例如:sheet.OpenTable("C9:H15")的返回值就是就是Table物件,這個Table所操作的區域就是”C9:H15”。 為何需要這個Table的概念呢?下面就說明一下使用Table物件的優點。 在實際的專案需求中,常常會需要在Excel 中迴圈的插入多條數的資料,比如:需要在excel中以B11單元格為起始位置,插入10條包含6個欄位的資料,如果使用Cell物件寫一個迴圈程式給單元格賦值會是這樣的:

DataTable dt = new DataTable();
for (int i = 0; i < 10; i++) // 10條資料
{
    sheet.OpenCellRC("B"+(11+i).ToString()).Value = dt.Rows[i][0].ToString();
    sheet.OpenCellRC("C"+(11+i).ToString()).Value = dt.Rows[i][1].ToString(); 
    sheet.OpenCellRC("D"+(11+i).ToString()).Value = dt.Rows[i][2].ToString(); 
    sheet.OpenCellRC("E"+(11+i).ToString()).Value = dt.Rows[i][3].ToString(); 
    sheet.OpenCellRC("F"+(11+i).ToString()).Value = dt.Rows[i][4].ToString(); 
    sheet.OpenCellRC("G"+(11+i).ToString()).Value = dt.Rows[i][5].ToString();         
}

如果使用Table物件程式設計,就與操作資料集的概念一樣,程式碼也更容易讀懂,程式碼如下:

DataTable dt = new DataTable();
PageOffice.ExcelWriter.Table table1 = sheet.OpenTable("B11:G20");
for (int i = 0; i < 10; i++) // 10條資料
{
    for (int j = 0; j <6; j++) // 6個欄位
    {
        table1.DataFields[j].Value = dt.Rows[i][j].ToString();        
    }
    table1.NextRow();
}
table1.Close();

讀者肯定會認為通過Cell實現這個賦值操作還有一個更好的方法,使用OpenCellRC方法,通過行列號操作會更簡單,程式碼如下:

DataTable dt = new DataTable();
for (int i = 0; i < 10; i++) // 10條資料
{
    for (int j = 0; j <6; j++) // 6個欄位
    {
        sheet.OpenCellRC(11+i,2+j )Value = dt.Rows[i][j].ToString();        
    }
}

情況確實是這樣,但是這個程式碼相對於Table物件的操作來說有點晦澀,只是看OpenCellRC中的引數是不容易立刻知道操作的是哪個單元格的,還有一個情況是通過Cell賦值無法做到的,那就是在已有的表格模板中插入不定行數的資料。例如:下圖中的模板在“合計”之前只有4行空白行,怎麼動態插入10條或更多條資料並且資料行的樣式也統一呢?

這種情況使用Cell是無法解決問題的,但是前面使用Table給Excel賦值的程式碼就可以解決這個問題。使用Table賦值的特點是:在賦值的過程中,如果Table所包含的區域行數不夠,那麼Table會自動插入行,並且迴圈重複使用Table區域中各行的樣式,直到所有的資料都填充完畢。使用Table物件填充資料的效果如下圖所示: