vertx框架 Excel导出(工具类)

本文介绍了一种使用Java实现的Excel导出方法,通过RoutingContext、JSONArray和LinkedHashMap等对象,实现了从json数据到Excel表格的转换。文章详细解释了如何设置Excel的字段,包括表头、边框样式及对齐方式,以及如何处理空值和默认参数。
 /**
     * 设置excel的字段
     * @param context  上下文
     * @param classmateList  传入的beanlist对象
     * @Param sheetName      一个sheet的表名
     * @param fileName       导出excel的文件名
     * @param head           excel第一行的头
     * @return
     */
    public static void excelUtil(RoutingContext context,
                                 JSONArray jsonArray,
                                 LinkedHashMap<String,String> map,
                                 String sheetName,
                                 String fileName){
        JsonResult jsonResult = new JsonResult();
        //如果上下文为空则返回
        if(context==null){
            System.out.println("传入的RoutingContext为空");
            return;
        }
        //如果传入的json数组为空则返回空
        if(jsonArray == null||jsonArray.size()<=0){
            System.out.println("传入的json数组为空");
            context.response().end("");
            return;
        }
        //如果传入sheetName的参数为空或者“”
        if(sheetName == null||sheetName.equals(""))
        {
            //设置sheet名称
            sheetName="sheet1";
        }
        //如果传入fileName的参数为空或者“”
        if(fileName == null||fileName.equals(""))
        {
            //指定默认的文件名为时间
            Date date = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            fileName=format.format(date);
        }

        HSSFWorkbook workbook = new HSSFWorkbook();
        //创建sheet表名
        HSSFSheet sheet = workbook.createSheet(sheetName);
        HSSFCellStyle style = workbook.createCellStyle();
        // 设置这些样式
        style.setAlignment(HorizontalAlignment.CENTER);//水平居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);//垂直居中

        // 设置边框
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        style.setBorderTop(BorderStyle.THIN);
        //创建首行
        HSSFRow tableHead = sheet.createRow(0);

        //获取第一个json数组中的第一个json对象
        JSONObject object = jsonArray.getJSONObject(0);

        //创键excel表头中列数
        int cell = 0;
        //设置表头
        for(String value:map.values()){
            //设置excel头部的每一列
            tableHead.createCell(cell).setCellValue(value);
            //将json中键的集合放入list中
            //cell自增
            cell++;
        }

        for(int i=0;i<jsonArray.size();i++){
            //获取body JSON数组中的json
            JSONObject body = jsonArray.getJSONObject(i);
            //创建excel中的每一个行
            HSSFRow row = sheet.createRow(i+1);
            int cell2 = 0;
            //将对应键的值插入到每一列的excel中
            for(String key:map.keySet())
            {
                Object obj = body.get(key);
                //如果obj为空则赋值空字符串
                if(obj==null)
                    obj = "";
                row.createCell(cell2).setCellValue(obj.toString());
                cell2++;
            }
        }
//        创建字节输入流
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        try{
            //将excel表的数据写入到字节流中
            workbook.write(bos);
        }catch(IOException e){
            throw new RuntimeException("export excel error");
        }
        //设置缓冲区
        Buffer buffer = Buffer.buffer();
        //将流中的内容写入到缓冲区中
        buffer.appendBytes(bos.toByteArray());
        context = setContext(context,fileName);
        context.response().end(buffer);
    }

    /**
     * //设置传输的格式
     * @param context 上下文
     * @param buffer    传输的buffer
     * @param fileName  文件名
     * @return
     */
    public static RoutingContext setContext(RoutingContext context,String fileName){
        //设置传输的格式
        context.response().putHeader("content-type", "application/octet-stream;charset=UTF-8");
        context.response().putHeader("Content-Disposition", "attachment;filename="+fileName+".xls");
        context.response().putHeader("Pargam", "no-cache");
        context.response().putHeader("Cache-Control", "no-cache");
        return context;
    }
在使用 Vert.x 框架时,编写单元测试的方法主要依赖于其线程模型的特性以及所提供的测试工具支持。由于 Vert.x 的核心 API 是线程安全的,因此可以直接在非 Vert.x 线程中创建和使用 `Vertx` 实例,这对于单元测试来说非常方便[^1]。 ### 单元测试的基本步骤 1. **初始化 Vertx 实例** 在测试类中创建一个 `Vertx` 实例,通常可以使用 `Vertx.vertx()` 方法来创建一个独立的实例。该实例可以在测试类的 `@Before` 方法中初始化,并在 `@After` 方法中关闭。 ```java private Vertx vertx; @Before public void setUp() { vertx = Vertx.vertx(); } @After public void tearDown() { vertx.close(); } ``` 2. **测试异步逻辑** Vert.x 是基于事件驱动和异步编程模型的框架,因此测试异步逻辑时,可以使用 `CountDownLatch` 或者 `CompletableFuture` 来等待异步操作完成。 ```java @Test public void testAsyncOperation() throws InterruptedException { CountDownLatch latch = new CountDownLatch(1); vertx.executeBlocking(promise -> { // 模拟异步操作 promise.complete("Result"); }, res -> { if (res.succeeded()) { assertEquals("Result", res.result()); latch.countDown(); } }); latch.await(5, TimeUnit.SECONDS); } ``` 3. **使用测试框架和工具库** Vert.x 提供了专门的测试模块 `vertx-unit`,它与 JUnit 等测试框架集成,可以更方便地进行异步测试。通过 `TestContext` 和 `Async` 对象,可以更清晰地管理异步测试逻辑。 ```java @RunWith(VertxUnitRunner.class) public class MyVerticleTest { private Vertx vertx; @Before public void setUp(TestContext context) { vertx = Vertx.vertx(); vertx.deployVerticle(MyVerticle.class.getName(), context.asyncAssertSuccess()); } @After public void tearDown(TestContext context) { vertx.close(context.asyncAssertSuccess()); } @Test public void testHttpServer(TestContext context) { Async async = context.async(); vertx.createHttpClient().getNow(8080, "localhost", "/", response -> { context.assertEquals(200, response.statusCode()); response.bodyHandler(body -> { context.assertEquals("Hello", body.toString()); async.complete(); }); }); } } ``` 4. **测试 Verticle 部署** 如果测试目标是某个 `Verticle` 实现类,可以通过 `vertx.deployVerticle()` 方法部署该 Verticle,并在部署完成后进行断言。 5. **模拟 HTTP 请求** 如果测试涉及 HTTP 服务,可以使用 `HttpClient` 发送请求,并验证响应结果。Vert.x 提供了完整的 HTTP 客户端 API,可以用于模拟请求和响应处理。 ### 注意事项 - **避免阻塞主线程**:在测试中应避免使用阻塞操作,否则可能导致测试失败或超时。 - **使用合适的测试工具**:推荐使用 `vertx-unit` 或 `vertx-junit5` 等工具来支持异步测试。 - **清理资源**:确保在测试完成后关闭 `Vertx` 实例,以释放资源。 ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值