【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007

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打开的效果比对一下,可以明显发现有如下的对应关系:

正是由于.xml跨平台无乱码的特性,因此这种输出Java数据到Excel的东西,便无须任何包,在任意的Java环境,包括JSP+Servlet+JDBC、Struts+Hibernate+Spring、安卓等只要用到Java语言的地方,就可以输出这种以.xls皆为的Excel表,我们需要的只不过是把输出的数据构造成上述形式的字符串而已!Windows中的Office 2003就能无乱码地读出来。

三、制作过程

因此,便有了如下的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");
	}
}
时间: 2024-08-01 10:45:02

【Java】无须额外的包,把Java中的内容输出到Excel中,无乱码,绝对兼容Excel2003与2007的相关文章

使用命令将logcat中的内容输出到文本文件中

网上搜集的方法,自己只是试了一下第一种,很好用,如果是/mylogcat.txt 直接保存在了d盘,我猜是直接保存在了sdk所在的盘的根目录下,希望对大家有帮助 使用如下命令可以将logcat中的内容输出到文本文件中: 第一种事例:adb logcat > /sdcard/mylogcat.txt 第二种事例:adb logcat > D:/Temp/1.txt(1.txt必须存在,才能写入logcat内容)

JAVA之编码---- CSV在文本下是正常的,用EXCEL打开是乱码的问题

JAVA之编码---->CSV在文本下是正常的,用EXCEL打开是乱码的问题 在JAVA下输出文件流,保存成CSV(用UTF-8)文件,怎么处理用EXCEL下是乱码,但是在记事本等其他软件都是正常的,同时显示也是UTF-8的编码,经过测试发现如下结果: 1.EXCEL只能打开ANSI的编码,而ANSI需要当前操作系统是什么编码,就用什么编码.如中文系统下,则只能认识GBK的编码,不可能认识UTF-8的编码,因此网上说的增加16进制下的EF BB BF,根本不是解决之道2.我们知道了EXCEL只能

c#.net循环将DataGridView中的数据赋值到Excel中,并设置样式

Microsoft.Office.Interop.Excel.Application excel =                new Microsoft.Office.Interop.Excel.Application();            excel.SheetsInNewWorkbook = 1;            excel.Workbooks.Add(); //设置Excel列名            excel.Cells[1, 1] = "学号";     

网页中的内容拷贝到EXCEL之后,有些对象无法删除

大家经常会遇到从某个系统的web页面上Copy内容到Excel中,之后,会发现有一些对象,像多选框,单选框无法删除. 看A1 位置的单选框 选中之后点delete也无法删除,很是急人啊. 不过,想要删除它也非常简单, 首先,点击ctrl+G 打开定位对话框,然后定位所有的对象,点击special  然后选择objects 这样,就选中了所有的对象.然后直接点delete就可以了 网页中的内容拷贝到EXCEL之后,有些对象无法删除

将数组A中的内容和数组B中的内容进行交换

交换两个数组的内容: #include<stdio.h> int main()//将数组A中的内容和数组B中的内容进行交换 { int a[5] = {  1, 2, 3, 4, 5 }; int b[5] = {  2, 3, 4, 5, 6 }; int tmp; int i; printf("before:\n"); for (i = 0; i<sizeof(a) / sizeof(a[0]); i++) { printf("%d ", a[

如何使用免费控件将Word表格中的数据导入到Excel中

我通常使用MS Excel来存储和处理大量数据,但有时候经常会碰到一个问题—我需要的数据存储在word表格中,而不是在Excel中,这样处理起来非常麻烦,尤其是在数据比较庞大的时候, 这时我迫切地需要将word表格中的数据导入到Excel中.相信大家也碰到过同样的问题,下面我就给大家分享一下在C#中如何使用免费控件来实现这一功能.这里,我使用了两个免费API, DocX和Spire.Xls. 有需要的朋友可以下载使用.下载地址: DocX:codeplex官网 Spire.Xls: E-iceb

maven-bundle-plugin 2.4.0以下版本导出META-INF中的内容到MANIFEST.MF中

今天终于把maven-bundle-plugin不能导出META-INF中的内容到Export-Package中的问题解决了,因为产品用的是OSGI框架,用到的第三方JAR包需要加载META-INF/XX/XX.xml这个内容,但在运行的时候getResource返回null. 经一番调查发现META-XX.XX这个包名没有导出,手动去修改MANIFEST.MF可以解决问题.但产品的源码中这个依赖是以maven-bundle-plugin进行打包的,在添加Export-Package:META-

机房收费系统———如何将MSFlexGrid中的数据导入到Excel中

机房收费系统进行了一段时间了,虽然说大体上跟学生信息管理系统一样,不过也有不一样的地方.比如说报表.如何将MSFlexGrid中德数据导入到Excel中等等.这些东西原来没有接触过,第一次接触难免有些陌生.这些问题困扰了我好长-时间,一看到它头都大了.不过,提高班名言——不将就是发现的源动力.本着这一原则,慢慢的攻克了这些问题. 机房收费系统中好几个地方需要将MSFlexGrid中德数据导入到Excel中,这是在学生信息管理系统中没有的功能.首先,首先需要在vb里面引用我们所需要的对象:Micr

jsp 页面内容导出到Excel中

日常使用网络资源时经常需要把网页中的内容下载到本地,并且导出到Excel中,现在介绍一种非常简单的方式实现网络资源的下载.只需要讲jsp的最上面加上一句话 <% response.reset(); response.setContentType("application/vnd.ms-excel;charset=GBK"); %> 就可以将网页的内容导出为Excel. 目前给出的例子为了方便起见,就是使用了纯粹的静态页面,一个table其中有一行是标题,一行是内容,但是实际