2009年10月11日 星期日

Export Excel

如同標題所言,要怎麼樣讓程式去 Export 一份 MS Office Excel 的檔案呢?

除了使用專門用來匯出 Excel 的套件之外,這邊提供幾種簡單的方法:

1. 不限定特殊格式,使用 .csv
這個就是以逗號隔開各欄位的檔案格式,夠簡單吧?

2.不限定特殊格式,使用 .xls
這個方法是把 xls 當作一個資料庫檔案來存取,只要該語言支援資料庫的讀寫
並且電腦中有 MS Excel 的 Driver,就可以寫入資料

3.可用特殊格式,使用 .xls
這個和第二種方式的不同在於,可以做字體變化,但缺點是,開啟檔案後
除了設定好了欄位之外,其他欄位不會出現格線(要自己開啟檢視格線)。



底下使用 Java 來達成這三種方式的實做,預計要做到這個樣子:


【使用逗號分隔文件】
import java.io.*;

public class ExportXls
{
public static void main(String[] args) throws Exception
{
PrintStream opt=new PrintStream("Way1.csv");
opt.println("姓名,學號,生日");
opt.println("王小明,123456,78.8.11,44");
opt.println("張小美,234567,77.10.13,54");
opt.println("李小華,134567,77.12.30,23");
opt.println("總和,,,=SUM(D2:D4)");
opt.close();
}
}
結果:

可以看見,沒有任何的格式,不過可以使用公式。


【用JDBC當作資料庫使用】

使用這個方法之前,要先建立一個 Excel 檔,給予適當的欄位名稱
這個範例中,就是粗體置中的「姓名 學號 生日 分數」 四個欄位
import java.sql.*;

public class ExportXls
{
public static void main(String[] args) throws Exception
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String connStr="jdbc:odbc:Driver={Microsoft Excel Driver (*.xls)};DBQ=Way2.xls;DriverID=22;READONLY=false";
Connection DBcon=DriverManager.getConnection(connStr,"","");
Statement stmt=DBcon.createStatement();
stmt.executeUpdate("insert into [Sheet1$] values('王小明','123456','78.8.11','44');");
stmt.executeUpdate("insert into [Sheet1$] values('張小美','234567','77.10.13','54');");
stmt.executeUpdate("insert into [Sheet1$] values('李小華','134567','77.12.30','23');");
stmt.executeUpdate("insert into [Sheet1$] values('總和','','','=SUM(D2:D4)');");
stmt.close();
DBcon.close();
}
}

結果:

真是慘不忍睹,格式難設定,也沒辦法使用公式。
不過這個方法拿來做「讀取」卻是最時好用方便的。
但是「寫入」就不太行了。


【使用 HTML 語法】

想不到吧?其實MS Office Excel 可以讀取 HTML 檔的,而且也可以使用
CSS 做格式的調整,基本上只要有
中的東西就可以了
(包含 <table></table> 標籤),不過為了要用 CSS 所以就打完整一點:
import java.io.*;

public class ExportXls
{
public static void main(String[] args) throws Exception
{
PrintStream opt=new PrintStream("Way3.xls");
opt.println("<html>");
opt.println("<head>");
opt.println(" <title>分數表</title>");
opt.println(" <style type=\"text/css\">");
opt.println(" .BOY{color: blue}");
opt.println(" .GIRL{color: pink}");
opt.println(" .HEAD{font-weight: bold;text-align: center}");
opt.println(" #MARK{background-color: yellow}");
opt.println(" </style></head><body>");
opt.println("<table border=1>");
opt.println("<tr class=\"HEAD\"><td>姓名</td><td>學號</td><td>生日</td><td>分數</td></tr>");
opt.println("<tr class=\"BOY\"><td>王小明</td><td>123456</td><td id=\"MARK\">78.8.11</td><td>44</td></tr>");
opt.println("<tr class=\"GIRL\"><td>張小美</td><td>234567</td><td>77.10.13</td><td>54</td></tr>");
opt.println("<tr class=\"BOY\"><td>李小華</td><td>134567</td><td>77.12.30</td><td>23</td></tr>");
opt.println("<tr><td>總和</td><td></td><td></td><td>=SUM(D2:D4)</td></tr>");
opt.println("</table></body></html>");
opt.close();
}
}
結果:

有格式,又有公式。雖然寫起來比較複雜,但是功能卻好很多。

1 則留言:

  1. 想不到xls是這樣的一回事 又受教了@@!

    回覆刪除