動態填充Excel文檔

PageOffice封裝了一組用於動態輸出數據到Excel文檔的相關類,所有包含在PageOffice.ExcelWriter 命名空間之中。PageOffice對Excel的賦值操做分兩種方式:web

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

  2. 針對一個區域賦值。這個區域在PageOffice的概念裏就是Table對象,好比:sheet.OpenTable("C9:H15")的返回值就是就是Table對象,這個Table就是」C9:H15」這個區域。下面就針對這兩種操做方式來分別介紹。字體

1、給Excel單元格賦值

JAVA代碼:spa

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代碼:excel

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對象:code

  • OpenCell(string CellAddress),參數爲單元格引用字符串。例如:"A1";
  • OpenCellRC(int Row,int Col),參數爲excel單元格的行數和列數。因此上面給Excel單元格賦值的代碼改爲下面的代碼也是能夠的。

JAVA代碼:orm

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

ASP.NET代碼:server

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

設置Cell的樣式對象

PageOffice中的Cell對象有不少個設置單元格樣式的屬性和對象,以下表所示:blog

名稱 說明
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樣式,因此在此不做詳細的敘述。

2、給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對象填充數據的效果以下圖所示: