数据库数据转入excel
数据库图片
/**
* 将数据库表中的内容写入到excel
* 关键技术:
*/
package task02文件操作实训之将数据库表中的内容写入到excel;
import java.io.File;
import java.io.FileOutputStream;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import java.sql.*;
public class ExcelWriter {
private File xlsFile = null;
private String dateFormat = null;
private HSSFWorkbook workbook = null;
private SimpleDateFormat dateFormatter = null;
/**
* . * 创建一个Excel文件写入器,所有数据将写入到指定的xls文件中
* . *
* . * @param xlsFile 指定目标文件位置,原位置已存在同名文件将被覆盖
* .
*/
public ExcelWriter(File xlsFile) {
this(xlsFile, null);//这里的this是低下两个参数的方法
}
/**
* . * 创建一个Excel文件写入器,所有数据将写入到指定的xls文件中;
* . * 写入日期时以指定格式形式写入
* . *
* . * @param xlsFile 指定目标文件位置,原位置已存在同名文件将被覆盖
* . * @param dateFormat 日期格式,如果为null则按本地日期格式
* .
*/
public ExcelWriter(File xlsFile, String dateFormat) {//如果数据类型有date,则这里可以规定
this.xlsFile = xlsFile;
workbook = new HSSFWorkbook();
try {
FileOutputStream fileoUut = new FileOutputStream(xlsFile);
workbook.write(fileoUut);//通过这个类的方法写入excel
fileoUut.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 写入数据库结果集的列名及数据到指定工作薄
*/
private boolean writeSheet(File file, ResultSet resultSet) throws SQLException {
HSSFWorkbook book = new HSSFWorkbook(); // 定义工作薄对象,创了一个工作簿
HSSFSheet sheet = book.createSheet("员工表"); // 创建工作表
ResultSetMetaData metaData = resultSet.getMetaData(); // 获取关于 ResultSet对象中列的类型和属性信息的对象。(相当于一个缓存到另一个缓存,但是两个缓存封装的方法不一样)
int rowNum = 0;
HSSFRow header = sheet.createRow(rowNum); // 写入列名,第一行
int colCount = metaData.getColumnCount(); // 获取数据库表中共有几列
for (int i = 0; i < colCount; i++) { // 循环遍历数据表列名
HSSFCell cell = header.createCell((short)i); // 根据数据库内容创建单元格
writeCell(cell, metaData.getColumnLabel(i + 1)); // 将数据库中的内容写入到单元格内,(数据库里是按照第一行开始的,excel是按照第0行开始的,同时这里涉及到了类型的转变)
}
// 为什么不用metaData获得行数呢?
while (resultSet.next()) { // 循环遍历查询结果集,resultSet.next()一行一行的往下查,如果没了返回false
rowNum++;
HSSFRow row = sheet.createRow(rowNum); // 创建一行
for (int i = 0; i < colCount; i++) {
HSSFCell cell = row.createCell((short)i); // 新建单元格
writeCell(cell, resultSet.getObject(i + 1)); // 将结果集中内容写入到单元格中
//writeCell(cell, metaData.getColumnLabel(i + 1)); // 将数据库中的内容写入到单元格内,(第一行是没有数字的)(也说明meta里只有列名,没有内容)
}
}
try {
FileOutputStream fileO = new FileOutputStream(file); // 创建FileOutputStream对象
book.write(fileO);//将工作簿写入指定软件
fileO.close();
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
/**
* 写入数据到指定单元格
*/
private void writeCell(HSSFCell hssFcell, Object object) {
if (object instanceof Date) { // 判断要写入的数值是否为日期类型(instanceof是Java中的二元运算符,左边是对象,右边是类;当对象是右边类或子类所创建对象时,返回true;否则,返回false,就是说左边是右边这个类型)
Date d = (Date) object;
hssFcell.setCellValue(new HSSFRichTextString(dateFormatter//上边有定义,没有则未指定,setCellValue()封装了不同参数类型的方法
.format(d)));// 日期以文本形式写入
} else if (object instanceof Boolean) { // 判断要写入的数值是否为布尔类型
boolean b = (Boolean) object;
hssFcell.setCellValue(b); // 向表格写入数据
} else if (object instanceof Number) { // 判断要写入的数据是否为数值类型
double d = ((Number) object).doubleValue();
hssFcell.setCellValue(d);// 向表格写数据
} else {
String s = (String) object;
hssFcell.setCellValue(new HSSFRichTextString(s));
}
}
//连接数据库,执行sql语句获取结果集
public ResultSet getRest() {
try {
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");//jar包高的可以不用这句,JAR里有,追踪一下
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Connection conn = null;
String url = "jdbc:sqlserver://localhost:1433;DatabaseName=db_javasx"; // 定义连接数据库的url
String userName = "sa"; // 连接数据库的用户名
String passWord = "123"; // 连接数据库的密码
try {
conn = DriverManager.getConnection(url, userName, passWord); // 获取数据库连接
} catch (SQLException e) {
e.printStackTrace();
}
ResultSet rest = null;//结果集,如果下面的语句执行则会返回结果在这里
// 定义查询的SQL语句
String sql = "select * from studentinfo";
Statement statement;
try {
statement = conn.createStatement(); // 创建Statement实例
rest = statement.executeQuery(sql); // 执行SQL语句
} catch (SQLException e) {
e.printStackTrace();
}
return rest;//返回结果集
}
public static void main(String[] args) {
File file = new File(".\\src\\task02文件操作实训之将数据库表中的内容写入到excel\\dbtoexcel.xls");
ExcelWriter excelWriter = new ExcelWriter(file);//嘿,过去再回来,不滑动,就是玩
ResultSet rest = excelWriter.getRest();
try {
if(excelWriter.writeSheet(file, rest))
{
System.out.println("写入excel成功!");
}
else
{
System.out.println("写入excel失败!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
/*
*/
/*
技术心得:
1、HSSFWorkbook excel文档对象
HSSFSheet excel的sheet
HSSFRow excel的行
HSSFCell excel的单元格
HSSFFont excel字体
HSSFName 名称
HSSFDataFormat 日期格式
HSSFHeader sheet头
HSSFFooter sheet尾
HSSFCellStyle cell样式
HSSFDateUtil 日期
HSSFPrintSetup 打印
HSSFErrorConstants 错误信息表
。。。。。。
2、
3、
。。。。。。
输出流如果没有指定文件,就创建。
输入流必须存在指定文件
*/
sql语句
use db_javasx
create table studentinfo(
id int identity(1,1) primary key,
name varchar(20) not null,
sex varchar(2) not null,
career varchar(10) not null,
city varchar(20) not null,
favorite varchar(50)
)
--insert一些测试数据
insert into studentinfo values('张三','男','IT','深圳','羽毛球网球');
insert into studentinfo values('李四','女','教师','上海','看书绘画');
insert into studentinfo values('vivian','男','医生','成都','书法');
select * from studentinfo
思路
结果:
话不多说,实用为大