Java输出一段文本到txt中大家基本都会了,这已经是学习Java的必修课了,不会也没有问题,具体可以看《【Java】输入与输出与JDK1.5之后的新型字符串StringBuilder》(点击打开链接)。网上对于Java内容转化成Excel的内容大多数都是需要什么poi包,jsl包,一堆奇奇怪怪的jar插件。其实仅仅利用java.io.*;这个基本包就能够把Java中的内容输出到Excel表中,当然,如果你是要处理Mysql数据库不要这样做了,直接一条Mysql的查询命令就能把Mysql的查询结果输出到Excel表中了。具体在《【Mysql】将Mysql的一张表导出至Excel》(点击打开链接)说过了,这里不再赘述。只是想举个例子说明,着重说明Java如果打印内容到Excel。
一、基本目标
在Java中有如下的学生类Student定义:
class Student { public int s_no; public String s_name; public int s_class; }
建立三个Student类,分别设置好学号、姓名与班级压入一个专门存放学生类的ArrayList当中,
public static void main(String args[]) throws IOException { ArrayList<Student> studentArr = new ArrayList<Student>(); Student s1 = new Student(); s1.s_no = 1; s1.s_name = "中文"; s1.s_class = 102; studentArr.add(s1); Student s2 = new Student(); s2.s_no = 2; s2.s_name = "是没有"; s2.s_class = 101; studentArr.add(s2); Student s3 = new Student(); s3.s_no = 3; s3.s_name = "问题的!"; s3.s_class = 103; studentArr.add(s3); javaToExcel(studentArr); System.out.println("学生表.xml已生成,该xml是专门以excel打开的xml"); }然后调用javaToExcel这个方法,这个核心方法是接下来讲解的重点,最后把这三个类输出到c:\学生表.xml中,具体效果如下:
二、基本思想
看到这里有人可能以为我是打错字,什么?Excel文件的后缀名不是.xls或者.xlsx吗?或者还有人以为我是故意输出xml然后右键以Excel的打开方式打开。
必须不是,这个xml的默认打开方式就是Microsofe Office Excel2003/2007。
在安装了Office 2003之后,在Windows2003中这个.xml文件打开方式同样是Microsofe Office Excel2003。
此.xml文件不是在《【Java】配置文件概念,Java对配置文件的操作》(点击打开链接)已经介绍过的配置文件,而是Excel2003与Excel2007中的其中一种保存格式,只是大家不习惯使用而已。
当然这东西本质上也是一个普通的.xml配置文件,由于其头,注明此乃转为Excel解释的xml文件,因此其默认的打开方式就是Excel,你如果设置以记事本打开这个学生表.xls,可以发生它的内容是这样的,半点乱码没有。不像那些.doc文件与.xls文件就一堆乱码。
<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?> <Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40"> <Worksheet ss:Name="学生表"> <Table> <Row> <Cell> <Data ss:Type="String">学号</Data> </Cell> <Cell> <Data ss:Type="String">姓名</Data> </Cell> <Cell> <Data ss:Type="String">班级</Data> </Cell> </Row> <Row> <Cell> <Data ss:Type="String">1</Data> </Cell> <Cell> <Data ss:Type="String">中文</Data> </Cell> <Cell> <Data ss:Type="String">102</Data> </Cell> </Row> <Row> <Cell> <Data ss:Type="String">2</Data> </Cell> <Cell> <Data ss:Type="String">是没有</Data> </Cell> <Cell> <Data ss:Type="String">101</Data> </Cell> </Row> <Row> <Cell> <Data ss:Type="String">3</Data> </Cell> <Cell> <Data ss:Type="String">问题的!</Data> </Cell> <Cell> <Data ss:Type="String">103</Data> </Cell> </Row> </Table> </Worksheet> </Workbook>
这个xml,大家与最终用Excel打开的效果比对一下,可以明显发现有如下的对应关系:
三、制作过程
因此,便有了如下的Excel表.xml文件的javaToExcel构造方法,此方法要求的一个存放好类的数组,最终什么都不返回。关键是构造好每一个<Row>与<Cell>,相信有过ASP、JSP、PHP编程经验的各位大神们对此根本没有问题,就像不停构造<td>,到了行头行尾构造<tr>就可以了。
public static void javaToExcel(ArrayList<Student> studentArr) throws IOException { //使用StringBuilder比String的效率比高,占用计算机资源没有这么多。 //最后输出前,转成字符串就可以了。 StringBuilder excelXMLStringBuilder = new StringBuilder(""); //构造好excelXML的头 excelXMLStringBuilder .append("<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\"><Worksheet ss:Name=\"学生表\"><Table>"); //输出好表头 excelXMLStringBuilder .append("<Row><Cell><Data ss:Type=\"String\">学号</Data></Cell><Cell><Data ss:Type=\"String\">姓名</Data></Cell><Cell><Data ss:Type=\"String\">班级</Data></Cell></Row>"); //构造出每一行 for (int i = 0; i < studentArr.size(); i++) { //先构造出<Row>节点 excelXMLStringBuilder.append("<Row>"); Student student = studentArr.get(i); //再不停地构造好每一个<Cell>节点 excelXMLStringBuilder.append("<Cell><Data ss:Type=\"String\">" + student.s_no + "</Data></Cell><Cell><Data ss:Type=\"String\">" + student.s_name + "</Data></Cell><Cell><Data ss:Type=\"String\">" + student.s_class + "</Data></Cell>"); excelXMLStringBuilder.append("</Row>"); } //再构造好excelXML的尾 excelXMLStringBuilder.append("</Table></Worksheet></Workbook>"); //最后把这个字符串打印到c:\学生表.xml就完事了 //false代表覆盖输出,不是在此文件的末尾继续输出 PrintWriter printwriter = new PrintWriter(new FileWriter("c:\\学生表.xml", false)); //输出前把excelXMLStringBuilder转化成字符串 printwriter.print(excelXMLStringBuilder + ""); //清空输出缓冲区 printwriter.flush(); //必须关闭文件输出流,Java才会在文件打印出字符串,也就是二进制流, printwriter.close(); }
四、总结与展望
因此整个Java文件连起来就是这个样子,这也算是xml的一个应用例子吧!或许有人会问我为何不直接输出成.csv,主要.csv这东西在Office2003与Office2007有Bug,笔者亲测无论用怎么编码,其默认打开都是有Bug的,必须用户自己做一定动作才能显示正常,这个相当不好,而.xls格式太复杂,如果没有额外的包的帮助很艰难的。尤其某些蛋疼的上司要求不让乱引入.jar,那你只能这样搞,.xml格式就再好不过了。
import java.io.*; import java.util.*; class Student { public int s_no; public String s_name; public int s_class; } public class excelPrint { public static void javaToExcel(ArrayList<Student> studentArr) throws IOException { //使用StringBuilder比String的效率比高,占用计算机资源没有这么多。 //最后输出前,转成字符串就可以了。 StringBuilder excelXMLStringBuilder = new StringBuilder(""); //构造好excelXML的头 excelXMLStringBuilder .append("<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?><Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" xmlns:html=\"http://www.w3.org/TR/REC-html40\"><Worksheet ss:Name=\"学生表\"><Table>"); //输出好表头 excelXMLStringBuilder .append("<Row><Cell><Data ss:Type=\"String\">学号</Data></Cell><Cell><Data ss:Type=\"String\">姓名</Data></Cell><Cell><Data ss:Type=\"String\">班级</Data></Cell></Row>"); //构造出每一行 for (int i = 0; i < studentArr.size(); i++) { //先构造出<Row>节点 excelXMLStringBuilder.append("<Row>"); Student student = studentArr.get(i); //再不停地构造好每一个<Cell>节点 excelXMLStringBuilder.append("<Cell><Data ss:Type=\"String\">" + student.s_no + "</Data></Cell><Cell><Data ss:Type=\"String\">" + student.s_name + "</Data></Cell><Cell><Data ss:Type=\"String\">" + student.s_class + "</Data></Cell>"); excelXMLStringBuilder.append("</Row>"); } //再构造好excelXML的尾 excelXMLStringBuilder.append("</Table></Worksheet></Workbook>"); //最后把这个字符串打印到c:\学生表.xml就完事了 //false代表覆盖输出,不是在此文件的末尾继续输出 PrintWriter printwriter = new PrintWriter(new FileWriter("c:\\学生表.xml", false)); //输出前把excelXMLStringBuilder转化成字符串 printwriter.print(excelXMLStringBuilder + ""); //清空输出缓冲区 printwriter.flush(); //必须关闭文件输出流,Java才会在文件打印出字符串,也就是二进制流, printwriter.close(); } public static void main(String args[]) throws IOException { ArrayList<Student> studentArr = new ArrayList<Student>(); Student s1 = new Student(); s1.s_no = 1; s1.s_name = "中文"; s1.s_class = 102; studentArr.add(s1); Student s2 = new Student(); s2.s_no = 2; s2.s_name = "是没有"; s2.s_class = 101; studentArr.add(s2); Student s3 = new Student(); s3.s_no = 3; s3.s_name = "问题的!"; s3.s_class = 103; studentArr.add(s3); javaToExcel(studentArr); System.out.println("学生表.xml已生成,该xml是专门以excel打开的xml"); } }
【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007
原文地址:http://blog.csdn.net/yongh701/article/details/44836581