Java实现根据sql动态查询并下载数据到excel
需求
由于生产数据库不能直接连接下载数据,所以需要在监控系统上做一个根据sql动态查询并下载数据的功能。
实现思路
写一个接口,传入需要查询的数据库信息和sql,将查询的接口导出到Excel中
实现细节
入参
@Data
public class ExportDataReq {
/**
* "jdbc:mysql://localhost:3306/your_database";
*/
@NotEmpty
String url;
@NotEmpty
String user;
@NotEmpty
String password;
@NotEmpty
String sql;
@NotEmpty
String[] titles;
}controller
@Slf4j
@Controller
@RequestMapping("/export/")
public class ExportController {
@Autowired
ExportService exportService;
@ApiOperation(value = "下载数据信息", notes = "日期格式:yyyy-MM-dd", httpMethod = "POST")
@PostMapping(value = "/exportData")
@ResponseBody
public BaseResponse exportData(@RequestBody @Valid ExportDataReq req,HttpServletResponse response) {
BaseResponse baseResponse = exportService.exportData(req, response);
return baseResponse;
}
}接口
public interface ExportService {
BaseResponse exportData(ExportDataReq req, HttpServletResponse response);
}服务
@Service
public class ExportServiceImpl implements ExportService {
@Override
public BaseResponse exportData(ExportDataReq req, HttpServletResponse response) {
try (Connection conn = DriverManager.getConnection(req.getUrl(), req.getUser(), req.getPassword());
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(req.getSql())) {
//创建wb
HSSFWorkbook wb = new HSSFWorkbook();
//创建sheet
HSSFSheet sheet = wb.createSheet("data");
//添加标题
addTitle(sheet,req.getTitles());
//添加内容
addRow(sheet,rs);
//导出
writeToResponse(response,wb,"data"+dateNow());
return ResponseUtils.success();
} catch (Exception ex) {
ex.printStackTrace();
return ResponseUtils.fail(ex.getMessage());
}finally {
}
}
protected void writeToResponse(HttpServletResponse response, HSSFWorkbook wb, String fileName) throws IOException {
response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName,"utf-8")+".xls");
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setCharacterEncoding("UTF-8");
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
wb.close();
}
private void addRow(HSSFSheet sheet, ResultSet rs) throws SQLException {
ResultSetMetaData rsMetaData = rs.getMetaData();
int columnCount = rsMetaData.getColumnCount();
int rowNum = 1;
while (rs.next()) {
Row row = sheet.createRow(rowNum++);
for (int i = 1; i <= columnCount; i++) {
Cell cell = row.createCell(i - 1);
String columnName = rsMetaData.getColumnName(i);
switch (rsMetaData.getColumnType(i)) {
case Types.VARCHAR:
case Types.CHAR:
cell.setCellValue(rs.getString(columnName));
break;
case Types.INTEGER:
cell.setCellValue(rs.getInt(columnName));
break;
case Types.DOUBLE:
cell.setCellValue(rs.getDouble(columnName));
break;
// Add other types as needed
default:
cell.setCellValue(rs.getString(columnName));
}
}
}
}
private void addTitle(HSSFSheet sheet, String[] titles) {
HSSFRow row = sheet.createRow((int) 0);
for (int i=0;i<titles.length;i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(titles[i]);
sheet.autoSizeColumn(i);//自动设宽
}
}
private String dateNow(){
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddhhmmss");
return sdf.format(new java.util.Date());
}
}然后通过postman即可导出数据,因为入参类型比较复杂,sql可能较长,所以此处使用post请求。
测试
入参
{"url":"jdbc:mysql://XXXX:63306/gac_order",
"user":"XXX",
"password":"xxx",
"sql":"select order_id,create_time,user_id,status from order_info limit 1000",
"titles":["order_id","create_time","user_id","status"]}postman send按钮下拉的Send and Download 可以顺利下载下数据
到此这篇关于Java实现根据sql动态查询并下载数据到excel的文章就介绍到这了,更多相关Java sql动态查询并下载数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Java spring MVC环境中实现WebSocket的示例代码
这篇文章主要介绍了Java spring MVC环境中实现WebSocket,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2023-09-09
MyBatis-Plus介绍及Spring Boot 3集成指南
本文介绍了MyBatis-Plus的基本特性及其与Spring Boot 3的集成步骤,通过使用MyBatis-Plus,开发者可以快速地搭建和开发数据访问层,同时提高代码质量和开发效率,感兴趣的朋友一起看看吧2024-05-05
SpringBoot启动报错Failed to determine a suitable driver class
这篇文章主要介绍了SpringBoot启动报错Failed to determine a suitable driver class,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2019-05-05


最新评论