将 JTable 导出到 Excel 文件
Export JTable into Excel file
我在这里尝试将 JTable 导出到 excel 文件中...我在控制台上没有收到任何错误...但是在 excel sheet 上我只有列names...我的目的是想在这个JTable方块中显示数据库table,在这个下面有导出按钮,所以点击这个按钮后应该为上面显示的JTable创建excel文件。
所以无法识别实际错误
JButton btnExport = new JButton("Export");
btnExport.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
try
{
String query="Select * from client";
PreparedStatement pst=conn.prepareStatement(query);
ResultSet rs=pst.executeQuery();
table.setModel(DbUtils.resultSetToTableModel(rs));
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow(0);
rowhead.createCell(0).setCellValue("Client_Vendor code");
rowhead.createCell(1).setCellValue("Client_Name");
rowhead.createCell(2).setCellValue("Purchaser_Name");
rowhead.createCell(3).setCellValue("User_Name");
rowhead.createCell(4).setCellValue("Sales_Engg");
int index=1;
while(rs.next())
{
HSSFRow row = sheet.createRow(index);
row.createCell(0).setCellValue(rs.getInt(1));
row.createCell(1).setCellValue(rs.getString(2));
row.createCell(2).setCellValue(rs.getString(3));
row.createCell(3).setCellValue(rs.getString(4));
row.createCell(4).setCellValue(rs.getString(5));
index++;
}
FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx");
wb.write(fileOut);
fileOut.close();
System.out.println("Data is saved in excel file.");
}
catch (Exception e)
{
e.printStackTrace();
}
所以你的问题就在这里...
table.setModel(DbUtils.resultSetToTableModel(rs));
DBUtils
是读到ResultSet
的结尾,意思是当你调用rs.next()
的时候,它returnsfalse
,因为没有了数据
你有两个选择...
你可以...
调用 ResultSet#beforeFirst
,但这并非所有数据库都支持,并且可能会影响性能
你可以...
停止使用 DBUtils
并手动构建 TableModel
。首先查看 How to Use Tables 了解更多详情
ResultSet rs = pst.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow(0);
DefaultTableModel model = new DefaultTableModel();
for (int col = 0; col < columnCount; col++) {
String columnName = rsmd.getColumnName(col + 1);
model.addColumn(columnName);
rowhead.createCell(col).setCellValue(columnName);
}
int index = 1;
while (rs.next()) {
Vector tableRow = new Vector(columnCount);
HSSFRow row = sheet.createRow(index);
for (int col = 0; col < columnCount; col++) {
Object value = rs.getObject(col + 1);
if (value instanceof Integer) {
row.createCell(col).setCellValue((int) value);
tableRow.add((int) value);
} else {
row.createCell(col).setCellValue(value.toString());
tableRow.add(value.toString());
}
}
model.addRow(tableRow);
}
try (FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx")) {
wb.write(fileOut);
}
我还建议您看看 JDBC Database Access and The try-with-resources Statement
我在这里尝试将 JTable 导出到 excel 文件中...我在控制台上没有收到任何错误...但是在 excel sheet 上我只有列names...我的目的是想在这个JTable方块中显示数据库table,在这个下面有导出按钮,所以点击这个按钮后应该为上面显示的JTable创建excel文件。
所以无法识别实际错误
JButton btnExport = new JButton("Export");
btnExport.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent arg0)
{
try
{
String query="Select * from client";
PreparedStatement pst=conn.prepareStatement(query);
ResultSet rs=pst.executeQuery();
table.setModel(DbUtils.resultSetToTableModel(rs));
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow(0);
rowhead.createCell(0).setCellValue("Client_Vendor code");
rowhead.createCell(1).setCellValue("Client_Name");
rowhead.createCell(2).setCellValue("Purchaser_Name");
rowhead.createCell(3).setCellValue("User_Name");
rowhead.createCell(4).setCellValue("Sales_Engg");
int index=1;
while(rs.next())
{
HSSFRow row = sheet.createRow(index);
row.createCell(0).setCellValue(rs.getInt(1));
row.createCell(1).setCellValue(rs.getString(2));
row.createCell(2).setCellValue(rs.getString(3));
row.createCell(3).setCellValue(rs.getString(4));
row.createCell(4).setCellValue(rs.getString(5));
index++;
}
FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx");
wb.write(fileOut);
fileOut.close();
System.out.println("Data is saved in excel file.");
}
catch (Exception e)
{
e.printStackTrace();
}
所以你的问题就在这里...
table.setModel(DbUtils.resultSetToTableModel(rs));
DBUtils
是读到ResultSet
的结尾,意思是当你调用rs.next()
的时候,它returnsfalse
,因为没有了数据
你有两个选择...
你可以...
调用 ResultSet#beforeFirst
,但这并非所有数据库都支持,并且可能会影响性能
你可以...
停止使用 DBUtils
并手动构建 TableModel
。首先查看 How to Use Tables 了解更多详情
ResultSet rs = pst.executeQuery();
ResultSetMetaData rsmd = rs.getMetaData();
int columnCount = rsmd.getColumnCount();
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("Excel Sheet");
HSSFRow rowhead = sheet.createRow(0);
DefaultTableModel model = new DefaultTableModel();
for (int col = 0; col < columnCount; col++) {
String columnName = rsmd.getColumnName(col + 1);
model.addColumn(columnName);
rowhead.createCell(col).setCellValue(columnName);
}
int index = 1;
while (rs.next()) {
Vector tableRow = new Vector(columnCount);
HSSFRow row = sheet.createRow(index);
for (int col = 0; col < columnCount; col++) {
Object value = rs.getObject(col + 1);
if (value instanceof Integer) {
row.createCell(col).setCellValue((int) value);
tableRow.add((int) value);
} else {
row.createCell(col).setCellValue(value.toString());
tableRow.add(value.toString());
}
}
model.addRow(tableRow);
}
try (FileOutputStream fileOut = new FileOutputStream("e:/CLIENTDATA/client.xlsx")) {
wb.write(fileOut);
}
我还建议您看看 JDBC Database Access and The try-with-resources Statement