java小工具项目,根据sql直接导出excel

线上服务器一般都禁止直接访问,所以无法用工具直接导出数据到excel。这个小工具项目为了方便导出


入口执行类:

package cn.com.bo.export;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.List;
import java.util.Map;

import org.apache.commons.dbcp.BasicDataSource;
import org.kohsuke.args4j.CmdLineException;
import org.kohsuke.args4j.CmdLineParser;
import org.kohsuke.args4j.Option;

import cn.com.bo.util.excel.ExportExcel;
import cn.com.bo.util.mysql.MysqlUtil;


/**
 * 入口执行类
 * 执行命令:java -cp export-excel-0.0.1-SNAPSHOT.jar cn.com.bo.export.App
 *  -u root 
 *  -p 123456
 *  -url 10.25.128.143:3306/dsp_new 
 *  -sql "select username,password from user;" 
 *  -pa export8.xls
 * @author ZhangShaobo
 * @date 2017-09-20
 */
public class App 
{
	
	/**
	 * @param args
	 */
    public static void main( String[] args )
    {
    	
    	AdxArg adxArg = new AdxArg();
    	CmdLineParser p = new CmdLineParser(adxArg);
		try {
			p.parseArgument(args);
		} catch (CmdLineException e) {
			e.printStackTrace();
		}
		exportExcel(adxArg);
    }
    
    public static void exportExcel(AdxArg adxArg){
    	BasicDataSource ds = new BasicDataSource();
		ds.setUsername(adxArg.username);
		ds.setPassword(adxArg.password);
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://"+adxArg.url+"?useUnicode=true&characterEncoding=UTF-8&useOldAliasMetadataBehavior=true");
    	MysqlUtil.init(ds);
    	List<Map<String, String>> list = MysqlUtil.exeSql(adxArg.sql);
    	FileOutputStream fileout = null;
		try {
			fileout = new FileOutputStream(new File(adxArg.path));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
    	ExportExcel.exportExcel("qwe", list, fileout, "yyyy-MM-dd");
    	
    }
    
    
}

class AdxArg{
	@Option(name = "-u", required = true, usage = "mysql username")
	public String username;
	
	@Option(name = "-p", required = true, usage = "mysql password")
	public String password;
	
	@Option(name = "-url", required = true, usage = "mysql url, ip:port/database")
	public String url;

	@Option(name = "-sql", required = true, usage = "sql")
	public String sql;
	
	@Option(name = "-pa", required = true, usage = "excel path")
	public String path;
	
}


导出工具类:

/**
     * 这是一个通用的方法,直接传入MAP obj的list,格式化成excel,标题列取的map的key
     * 
     * @param title 
     * 
     * @param list 
     * 				List<Map<String, String>> list
     * @param out 
     * 				与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
     * @param pattern
     * 				如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
     */
    @SuppressWarnings({ "deprecation"})
	public static void exportExcel(String title, 
            List<Map<String, String>> list, OutputStream out, String pattern) {
    	
    	List<String> headers = new ArrayList<>();
    	if (list == null || list.size() == 0) {
			throw new NullPointerException();
		}
		for (String m : list.get(0).keySet()) {
			headers.add(m);
		}
    	
        // 声明一个工作薄
        HSSFWorkbook workbook = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = workbook.createSheet(title);
        // 设置表格默认列宽度为15个字节
        sheet.setDefaultColumnWidth((short) 24);
        // 生成一个样式
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setAlignment(CellStyle.ALIGN_CENTER);
        // 生成一个字体
        HSSFFont font = workbook.createFont();
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(Font.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        //style.setFont(font);
        // 生成并设置另一个样式
        HSSFCellStyle style2 = workbook.createCellStyle();
        style2.setBorderBottom(CellStyle.BORDER_THIN);
        style2.setBorderLeft(CellStyle.BORDER_THIN);
        style2.setBorderRight(CellStyle.BORDER_THIN);
        style2.setBorderTop(CellStyle.BORDER_THIN);
        style2.setAlignment(CellStyle.ALIGN_CENTER);
        style2.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
        // 生成另一个字体
        HSSFFont font2 = workbook.createFont();
        font2.setBoldweight(Font.BOLDWEIGHT_NORMAL);
        // 把字体应用到当前的样式
        style2.setFont(font2);

        // 声明一个画图的顶级管理器
        HSSFPatriarch patriarch = sheet.createDrawingPatriarch();

        // 产生表格标题行
        HSSFRow row = sheet.createRow(0);        
        for (short i = 0; i < headers.size(); i++) {        	
            HSSFCell cell = row.createCell(i);
            cell.setCellStyle(style);
            //HSSFRichTextString text = new HSSFRichTextString(headersa[i]);
            
            cell.setCellValue(headers.get(i));
        }

        // 遍历集合数据,产生数据行
        int index = 0;
        for (Map<String, String> map : list) {
        	index++;
            row = sheet.createRow(index);
            int j = 0;
            for (String m : map.keySet()) {
				HSSFCell cell = row.createCell(j);
	            cell.setCellStyle(style2);
	            cell.setCellValue(map.get(m));
	            j++;
			}
		}
        try {
            workbook.write(out);
        } catch (IOException e) {
        	JOptionPane.showMessageDialog(null, "文件下载失败!");
            throw new RuntimeException();
        }
    }

查询数据库的通用方法,返回List<Map<String,String>>:

    public static List<Map<String, String>> exeSql(String sql)
    {
    	logger.info("sql = {"+sql+"}");
        Connection conn = null;
        Statement stmt = null;
        List<Map<String, String>> result = new ArrayList<Map<String, String>>();
        try
        {
            conn = getConnection();
            stmt = conn.createStatement();
            rs = stmt.executeQuery(sql);
            int columnCount = rs.getMetaData().getColumnCount();

            while (rs.next())
            {
            	Map<String, String> map = new HashMap<String, String>();
                for (int i = 1; i <= columnCount; i++)
                {
                	map.put(rs.getMetaData().getColumnName(i), rs.getString(i));
                }
                result.add(map);
            }
            return result;

        }
        catch (Exception e)
        {
        	logger.error("execute sql " + sql + " error:");
        	logger.error(e.getMessage());
            result = new ArrayList<Map<String, String>>();
            return result;
        }
        finally
        {
        	closeConn();  
        }
    }




执行命令:

 * 执行命令:java -cp export-excel-0.0.1-SNAPSHOT.jar cn.com.bo.export.App
 *  -u root 
 *  -p 123456
 *  -url 10.25.128.143:3306/dsp_new 
 *  -sql "select username,password from user;" 
 *  -pa export8.xls




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
这里提供一个基于Spring Boot和Apache POI的工具类,可以方便地将MySQL数据库中的数据导出Excel文件并返回给前端。 ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.IndexedColors; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; public class ExcelUtil { // MySQL数据库连接信息 private static final String DRIVER = "com.mysql.jdbc.Driver"; private static final String URL = "jdbc:mysql://localhost:3306/dbname"; private static final String USERNAME = "username"; private static final String PASSWORD = "password"; // 导出Excel文件 public static void exportExcel(String sql, HttpServletResponse response) throws IOException, SQLException { // 1. 获取数据库连接 Connection conn = DriverManager.getConnection(URL, USERNAME, PASSWORD); // 2. 执行SQL查询 PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); // 3. 获取查询结果列名和数据 ResultSetMetaData meta = rs.getMetaData(); int columnCount = meta.getColumnCount(); List<String> columnNames = new ArrayList<>(); List<List<Object>> data = new ArrayList<>(); for (int i = 1; i <= columnCount; i++) { columnNames.add(meta.getColumnName(i)); } while (rs.next()) { List<Object> rowData = new ArrayList<>(); for (int i = 1; i <= columnCount; i++) { rowData.add(rs.getObject(i)); } data.add(rowData); } // 4. 创建Excel工作簿对象 Workbook workbook = new HSSFWorkbook(); Sheet sheet = workbook.createSheet(); // 5. 设置列名样式 Font headerFont = workbook.createFont(); headerFont.setBold(true); headerFont.setColor(IndexedColors.WHITE.index); CellStyle headerStyle = workbook.createCellStyle(); headerStyle.setAlignment(HorizontalAlignment.CENTER); headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); headerStyle.setFillForegroundColor(IndexedColors.BLUE.index); headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND); headerStyle.setFont(headerFont); // 6. 写入列名 Row headerRow = sheet.createRow(0); for (int i = 0; i < columnCount; i++) { headerRow.createCell(i).setCellValue(columnNames.get(i)); headerRow.getCell(i).setCellStyle(headerStyle); } // 7. 写入数据 for (int i = 0; i < data.size(); i++) { Row row = sheet.createRow(i + 1); for (int j = 0; j < columnCount; j++) { row.createCell(j).setCellValue(data.get(i).get(j).toString()); } } // 8. 将工作簿写入字节数组输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); workbook.write(out); // 9. 设置HTTP响应头 response.setContentType("application/vnd.ms-excel"); response.setHeader("Content-disposition", "attachment;filename=data.xls"); // 10. 将字节数组输出流写入响应流 ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(out.toByteArray()); // 11. 关闭资源 outputStream.flush(); outputStream.close(); out.flush(); out.close(); rs.close(); stmt.close(); conn.close(); } } ``` 使用时,只需要调用`ExcelUtil.exportExcel(sql, response)`方法即可,其中`sql`参数为要执行的SQL查询语句,`response`参数为HTTP响应对象。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值