首页 文章 精选 留言 我的

精选列表

搜索[java],共10000篇文章
优秀的个人博客,低调大师

会员卡删卡(alipay.marketing.card.delete)JAVA版本demo

说明: 该接口是通过API接口进行删除会员卡的操作流程,官方接口文档【会员卡删卡】 开卡接口请参考该贴:[url]https://openclub.alipay.com/read.php?tid=1628&fid=71[/url]代码调用示例: public static void Card_Delete(){ AlipayClient alipayClient=alipayclient(); AlipayMarketingCardDeleteRequest request = new AlipayMarketingCardDeleteRequest(); request.setBizContent("{" + //该值唯一性,必须每次请求都不一样

优秀的个人博客,低调大师

想在Java中实现Excel和Csv的导出吗?看这就对了

前言 最近在项目中遇到一个需求,需要后端提供一个下载Csv和Excel表格的接口。这个接口接收前端的查询参数,针对这些参数对数据库做查询操作。将查询到的结果生成Excel和Csv文件,再以字节流的形式返回给前端。 前端拿到这个流文件之后,最开始用ajax来接收,但是前端发送的请求却被浏览器cancel掉了。后来发现,发展了如此之久的Ajax居然不支持流文件下载。后来前端换成了最原始的XMLHttpRequest,才修复了这个问题。 首先给出项目源码的地址。这是源码,欢迎大家star或者提MR。 Csv 新建controller 先来一个简单的例子。首先在controller中新建这样一个接口。 @GetMapping("csv") public void csv( HttpServletRequest request, HttpServletResponse response ) throws IOException { String fileName = this.getFileName(request, "测试数据.csv"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString()); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); LinkedHashMap<String, Object> header = new LinkedHashMap<>(); LinkedHashMap<String, Object> body = new LinkedHashMap<>(); header.put("1", "姓名"); header.put("2", "年龄"); List<LinkedHashMap<String, Object>> data = new ArrayList<>(); body.put("1", "小明"); body.put("2", "小王"); data.add(header); data.add(body); data.add(body); data.add(body); FileCopyUtils.copy(ExportUtil.exportCSV(data), response.getOutputStream()); } 其中this.getFileName(request, "测试数据.csv")函数是用来获取导出文件名的函数。单独提出来是因为不同浏览器使用的默认的编码不同。例如,如果使用默认的UTF-8编码。在chrome浏览器中下载会出现中文乱码。代码如下。 private String getFileName(HttpServletRequest request, String name) throws UnsupportedEncodingException { String userAgent = request.getHeader("USER-AGENT"); return userAgent.contains("Mozilla") ? new String(name.getBytes(), "ISO8859-1") : name; } response.getOutputStream()则是用于创建字节输出流,在导出csv文件的controller代码结尾,通过工具类中的复制文件函数将字节流写入到输出流中,从而将csv文件以字节流的形式返回给客户端。 当前端通过http请求访问服务器接口的时候,http中的所有的请求信息都会封装在HttpServletRequest对象中。例如,你可以通过这个对象获取到请求的URL地址,请求的方式,请求的客户端IP和完整主机名,Web服务器的IP和完整主机名,请求行中的参数,获取请求头的参数等等。 针对每一次的HTTP请求,服务器会自动创建一个HttpServletResponse对象和请求对象相对应。响应对象可以对当前的请求进行重定向,自定义响应体的头部,设置返回流等等。 新建导出工具类 我们新建一个导出工具类,来专门负责导出各种格式的文件。代码如下。 public class ExportUtil { public static byte[] exportCSV(List<LinkedHashMap<String, Object>> exportData) { ByteArrayOutputStream out = new ByteArrayOutputStream(); BufferedWriter buffCvsWriter = null; try { buffCvsWriter = new BufferedWriter(new OutputStreamWriter(out, StandardCharsets.UTF_8)); // 将body数据写入表格 for (Iterator<LinkedHashMap<String, Object>> iterator = exportData.iterator(); iterator.hasNext(); ) { fillDataToCsv(buffCvsWriter, iterator.next()); if (iterator.hasNext()) { buffCvsWriter.newLine(); } } // 刷新缓冲 buffCvsWriter.flush(); } catch (IOException e) { e.printStackTrace(); } finally { // 释放资源 if (buffCvsWriter != null) { try { buffCvsWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } return out.toByteArray(); } private static void fillDataToCsv(BufferedWriter buffCvsWriter, LinkedHashMap row) throws IOException { Map.Entry propertyEntry; for (Iterator<Map.Entry> propertyIterator = row.entrySet().iterator(); propertyIterator.hasNext(); ) { propertyEntry = propertyIterator.next(); buffCvsWriter.write("\"" + propertyEntry.getValue().toString() + "\""); if (propertyIterator.hasNext()) { buffCvsWriter.write(","); } } } } fillDataToCsv主要是抽离出来为csv填充一行一行的数据的。 运行 然后运行项目,调用http://localhost:8080/csv,就可以下载示例的csv文件。示例如下。 Excel 新建controller 新建下载xlsx文件的接口。 @GetMapping("xlsx") public void xlsx( HttpServletRequest request, HttpServletResponse response ) throws IOException { String fileName = this.getFileName(request, "测试数据.xlsx"); response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString()); response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";"); List<LinkedHashMap<String, Object>> datas = new ArrayList<>(); LinkedHashMap<String, Object> data = new LinkedHashMap<>(); data.put("1", "姓名"); data.put("2", "年龄"); datas.add(data); for (int i = 0; i < 5; i++) { data = new LinkedHashMap<>(); data.put("1", "小青"); data.put("2", "小白"); datas.add(data); } Map<String, List<LinkedHashMap<String, Object>>> tableData = new HashMap<>(); tableData.put("日报表", datas); tableData.put("周报表", datas); tableData.put("月报表", datas); FileCopyUtils.copy(ExportUtil.exportXlsx(tableData), response.getOutputStream()); } 补充工具类 上面新建的导出工具类中,只有导出csv的函数,接下来我们要添加导出xlsx的函数。 public static byte[] exportXlsx(Map<String, List<LinkedHashMap<String, Object>>> tableData) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { HSSFWorkbook workbook = new HSSFWorkbook(); // 创建多个sheet for (Map.Entry<String, List<LinkedHashMap<String, Object>>> entry : tableData.entrySet()) { fillDataToXlsx(workbook.createSheet(entry.getKey()), entry.getValue()); } workbook.write(out); } catch (IOException e) { e.printStackTrace(); } return out.toByteArray(); } /** * 将linkedHashMap中的数据,写入xlsx表格中 * * @param sheet * @param data */ private static void fillDataToXlsx(HSSFSheet sheet, List<LinkedHashMap<String, Object>> data) { HSSFRow currRow; HSSFCell cell; LinkedHashMap row; Map.Entry propertyEntry; int rowIndex = 0; int cellIndex = 0; for (Iterator<LinkedHashMap<String, Object>> iterator = data.iterator(); iterator.hasNext(); ) { row = iterator.next(); currRow = sheet.createRow(rowIndex++); for (Iterator<Map.Entry> propertyIterator = row.entrySet().iterator(); propertyIterator.hasNext(); ) { propertyEntry = propertyIterator.next(); if (propertyIterator.hasNext()) { String value = String.valueOf(propertyEntry.getValue()); cell = currRow.createCell(cellIndex++); cell.setCellValue(value); } else { String value = String.valueOf(propertyEntry.getValue()); cell = currRow.createCell(cellIndex++); cell.setCellValue(value); break; } } if (iterator.hasNext()) { cellIndex = 0; } } } fillDataToXlsx的用途与csv一样,为xlsx文件的每一行刷上数据。 运行 然后运行项目,调用http://localhost:8080/xlsx,就可以下载示例的csv文件。示例如下。 项目地址 最后再次给出项目地址,大家如果没有理解到其中的一些地方,不妨把项目clone下来,自己亲自操作一波。 参考 这是在解决请求被浏览器cancel掉的过程中,很重要的一个参考,分享给大家。 https://www.cnblogs.com/cdemo/p/5225848.html

优秀的个人博客,低调大师

Java开发物业管理系统:数据库表单设计

按照功能分为: 用户表 费用表 投诉建议表 第一步创建数据库: CREATE DATABASE yellowstar; 用户表 创建用户表 表名:yw_users CREATE TABLE IF NOT EXISTS yw_users ( uid INT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT 'UID', username VARCHAR(20) NOT NULL UNIQUE comment '用户名', password CHAR(32) NOT NULL COMMENT '密码:md5加密', user_type TINYINT UNSIGNED NOT NULL COMMENT '用户类型', create_time DATE NOT NULL COMMENT '创建时间' ); type字段说明: 1:超级管理员 2:物业 3:业主 插入测试数据 INSERT INTO yw_users (username,password,user_type,create_time) VALUES ('user1',123456,1,20181101), ('user2',123456,2,20181201), ('user3',123456,3,20181230); 业主房产信息表 房产信息表 表名:yw_houses CREATE TABLE IF NOT EXISTS yw_houses ( hid INT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '房产号', username VARCHAR(20) NOT NULL comment '房产持有人', house_type VARCHAR(20) NOT NULL comment '房产类型', area DOUBLE UNSIGNED NOT NULL COMMENT '住房面积', buy_date DATE NOT NULL COMMENT '购房时间', building_no VARCHAR(20) NOT NULL comment '楼号', unit VARCHAR(10) NOT NULL comment '小区单元', card_id INT UNSIGNED NOT NULL COMMENT '门牌号', phone VARCHAR(11) NOT NULL comment '手机号码', ); 插入测试数据 INSERT INTO yw_houses (username,house_type,area,buy_date,building_no,unit,card_id,phone) VALUES ('张三','三室一厅',100,'2019-01-01','1号楼','一单元',902,'158****9177'), ('李四','三室二厅二卫',130,'2017-01-01','8号楼','二单元',102,'152****9127'), ('冠希','一室一厅',50,'2018-01-01','9号楼','一单元',401,'151****9147'); 费用表 费用单价表 表名:yw_perprice CREATE TABLE IF NOT EXISTS yw_perprice ( id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '单价编号', p_type INT UNSIGNED NOT NULL comment '单价类型', price DECIMAL(18,2) UNSIGNED NOT NULL comment '单价', p_date DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '定价时间' ); p_type说明: 1:水费 2:电费 3:燃气费 4:停车费 5:物业费 插入测试数据 INSERT INTO yw_perprice (p_type,price) VALUES (1,3.45), (2,0.5), (3,1.64), (4,5), (5,50); 水费、电费、燃气费、物业费表 表名:yw_totalprice CREATE TABLE IF NOT EXISTS yw_totalprice ( id INT UNSIGNED NOT NULL AUTO_INCREMENT KEY COMMENT '编号', hid INT UNSIGNED NOT NULL COMMENT '外键房产id', p_type INT UNSIGNED NOT NULL comment '单价类型', price DECIMAL(18,2) UNSIGNED NOT NULL comment '单价', amount DECIMAL(18,2) UNSIGNED NOT NULL comment '用量', money DECIMAL(18,2) UNSIGNED NOT NULL comment '总额', buy_date DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '消费时间', FOREIGN KEY(hid) REFERENCES yw_houses(hid) ); 注意:这里使用了外键 插入测试数据 INSERT INTO yw_totalprice (hid,p_type,amount,price,money) VALUES (1,1,30,(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1),30*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,1,21,(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1),21*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,2,40,(SELECT price FROM yw_perprice WHERE p_type=2 LIMIT 1),40*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,2,34,(SELECT price FROM yw_perprice WHERE p_type=2 LIMIT 1),34*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,3,23,(SELECT price FROM yw_perprice WHERE p_type=3 LIMIT 1),23*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,4,22,(SELECT price FROM yw_perprice WHERE p_type=4 LIMIT 1),22*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,4,12,(SELECT price FROM yw_perprice WHERE p_type=4 LIMIT 1),12*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,5,12,(SELECT price FROM yw_perprice WHERE p_type=5 LIMIT 1),12*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (1,5,12,(SELECT price FROM yw_perprice WHERE p_type=5 LIMIT 1),12*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,1,23,(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1),23*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,1,56,(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1),56*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,2,16,(SELECT price FROM yw_perprice WHERE p_type=2 LIMIT 1),16*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,3,15,(SELECT price FROM yw_perprice WHERE p_type=3 LIMIT 1),15*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,3,90,(SELECT price FROM yw_perprice WHERE p_type=3 LIMIT 1),90*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,4,44,(SELECT price FROM yw_perprice WHERE p_type=4 LIMIT 1),44*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)), (2,4,46,(SELECT price FROM yw_perprice WHERE p_type=4 LIMIT 1),46*(SELECT price FROM yw_perprice WHERE p_type=1 LIMIT 1)) ; 注意:这里插入数据使用了子查询 查询讲解:查询所有业主电费: SELECT hid as '业主物业ID',price as '单价',amount as '用量',money as '金额',buy_date as '时间' FROM yw_totalprice WHERE p_type = 1; 查询所有业主电费(增加显示业主姓名): SELECT username as '业主物业姓名',price as '单价',amount as '用量',money as '金额',a.buy_date as '时间' FROM yw_totalprice AS A JOIN yw_houses AS b ON a.hid = b.hid WHERE p_type = 1; 知识点:这里使用了表连接 查询某业主的电费:在where里增加一个限定条件就可以了 SELECT username as '业主物业姓名',price as '单价',amount as '用量',money as '金额',a.buy_date as '时间' FROM yw_totalprice AS A JOIN yw_houses AS b ON a.hid = b.hid WHERE p_type = 1 AND a.hid = 1; 其他费用类推,基本就是改改p_type类型,需要什么数据传什么值就可以了。 投诉建议表(待添加)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册