java導出excel

一、需求背景

  在項目開發中,經常會遇到導出Excel報表文件的情況,因爲很多情況下,我們需要打印Excel報表,雖然在網頁上也可以生成報表,但是打印網上裏的報表是無法處理排版問題的,所以最好的方式,還是生成Excel文件。

       PageOffice封裝了一組用於動態輸出數據到Excel文檔的相關類,全部包含在com.zhuozhengsoft.pageoffice.excelwriter  命名空間之中。PageOffice對Excel的賦值操作分兩種方式:1. 單元格賦值,這個很好理解,sheet.openCell("D5"),返回值就是一個Cell對象;2. 針對一個區域賦值。這個區域在PageOffice的概念裏就是Table對象,比如:sheet.openTable("C9:H15")的返回值就是就是Table對象,這個Table就是”C9:H15”這個區域。下面就針對這兩種操作方式來分別介紹。

二、 給Excel單元格賦值

  創建Workbook對象,操作指定sheet中的指定單元格,在打開Excel文件後通過PageOfficeCtrl對象的setWriter方法把數據寫入到Excel文件中:

複製代碼

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, "");

複製代碼

  通過上面的代碼可以看出,給Excel單元格賦值,首先需要創建Workbook對象,然後通過此對象的OpenSheet方法,獲取到Sheet對象,再通過Sheet對象的OpenCell方法就可以獲取的Cell對象,進行賦值或其他操作。

  Sheet對象有兩個方法可以獲取到Cell對象:1. openCell(String CellAddress),參數爲單元格引用字符串。例如:"A1";2. openCellRC(int Row, int Col),參數爲excel單元格的行數和列數。所以上面給Excel單元格賦值的代碼改成下面的代碼也是可以的。

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

三、設置Cell的樣式

  

  這些屬性不但可以用來設置單元格的前景色、背景色、邊框、字體和對齊方式,甚至可以設置公式,基本上所有的單元格設置需求都可以實現。比如:設置一個單元格的背景色爲爲綠色。

  

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

  果要設置單元格的字體,就需要操作Font對象進行設置;如果要設置單元格的邊框樣式,就需要操作Border對象進行設置。使用Border對象設置Excel的單元格樣式,是可以分別對單元格的上下左右邊框單獨設置樣式的,所以再複雜的表格樣式用PageOffice也可以“繪製”出來。PageOffice中的Table對象可以設置Table的Border樣式,所以在此不作詳細的敘述,下面單獨用一個章節來敘述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賦值無法做到的,那就是在已有的表格模板中插入不定行數的數據。例如:下圖中的模板在“合計”之前只有10行空白行,怎麼動態插入50條數據並且數據行的樣式也統一呢?這種情況使用Cell是無法解決問題的,但是前面使用Table給Excel賦值的代碼就可以解決這個問題。使用Table賦值的特點是:在賦值的過程中,如果Table所包含的區域行數不夠,那麼Table會自動插入行,並且循環重複使用Table區域中各行的樣式,直到所有的數據都填充完畢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章