Apache POI-Excel入门与实战

news2024/9/20 5:34:40

目录

一、了解Apache POI

1.1 什么是Apache POI

1.2 为什么要使用ApaChe POI

1.3 Apache POI应用场景

1.4 Apache POI 依赖

二、Apache POI-Excel 入门案例

2.1 写入Excel文件

2.2 读取文件

四、Apache POI实战

4.1 创建一个获取天气的API

4.2高德天气请求API与响应结果

4.2 后端访问API获取数据

4.3 通过获取地方名称获取AdCode编码

4.4 使用Apache POI包装数据并将预测结果输出到Excel表格中


一、了解Apache POI

1.1 什么是Apache POI

1.2 为什么要使用ApaChe POI

  1. 兼容性:POI能够与各种版本的Office文档进行交互,无论是在创建新文件还是在读取旧文件时,都提供了良好的兼容性。
  2. 无需Office安装:使用POI可以在没有实际安装Microsoft Office软件的情况下操作Office文档,这对于服务器环境尤其重要。
  3. 灵活性:POI提供了丰富的API,允许开发人员以编程方式对Office文档进行复杂的操作,如添加公式、图表、图片、样式等。
  4. 性能:相比于其他一些解决方案,如使用自动化Office应用程序的方式,POI在处理大量数据时通常具有更好的性能。
  5. 安全性:由于POI不需要运行任何Office应用程序,因此可以避免潜在的安全风险,比如宏病毒或恶意脚本的执行。
  6. 开源:POI是一个开源项目,这意味着它是免费的,并且有一个活跃的社区支持,可以提供帮助和持续的更新。

1.3 Apache POI应用场景
 

1.4 Apache POI 依赖

<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi</artifactId>  
    <version>3.16</version>  
</dependency>  
<dependency>  
    <groupId>org.apache.poi</groupId>  
    <artifactId>poi-ooxml</artifactId>  
    <version>3.16</version>  
</dependency>

二、Apache POI-Excel 入门案例

2.1 写入Excel文件

/**  
 * ApachePOI 测试类  
 */  
public class ApachePOITest {  
  
    /**  
     * 读取 Excel 文件  
     */  
    public static void write() {  
        // 在内存中创建一个 Excel 文件  
        XSSFWorkbook excel = new XSSFWorkbook();  
        // 创建一个工作表sheet  
        XSSFSheet sheet = excel.createSheet("info");  
        //在sheet中添加表头第1行,RowNum是从0开始的  
        XSSFRow row = sheet.createRow(1);  
        row.createCell(1).setCellValue("姓名");  
        row.createCell(2).setCellValue("年龄");  
  
        //创建一个新的row  
        XSSFRow row2 = sheet.createRow(2);  
        //在row中创建单元格  
        row2.createCell(1).setCellValue("张三");  
        row2.createCell(2).setCellValue("20");  
  
        //创建一个新的row  
        sheet.createRow(3).createCell(1).setCellValue("李四");  
        sheet.getRow(3).createCell(2).setCellValue("30");  
  
        //将excel写入到文件中  
        try {  
            //通过文件输出流将内存中的excel写入到文件中  
            FileOutputStream fileOutputStream = new FileOutputStream("E:" + File.separator + "POITest.xlsx");  
            excel.write(fileOutputStream);  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
  
    }  
  
    public static void main(String[] args) {  
        write();  
    }  
	//关闭流
	excel.close
}

2.2 读取文件

/**  
 * 读取 Excel 文件  
 */  
public  static  void read() throws IOException {  
    //通过文件输入流读取文件  
    FileInputStream fileInputStream = new FileInputStream("E:" + File.separator + "POITest.xlsx");  
    XSSFWorkbook excel = new XSSFWorkbook(fileInputStream);  
    //读取第一个工作表  
    //XSSFSheet sheet = excel.getSheet("info");  
    XSSFSheet sheetAt = excel.getSheetAt(0);  
  
    //获取最后一行的行号  
    int lastRowNum = sheetAt.getLastRowNum();  
    //从第二行开始读取数据  
    for (int i = 1; i <= lastRowNum; i++) {  
        //获取当前行  
        XSSFRow row = sheetAt.getRow(i);  
        //获取当前行的最后一个单元格的编号  
        short lastCellNum = row.getLastCellNum();  
  
        //遍历所有的单元格,从第二个单元格开始  
        for (int j = 1; j < lastCellNum; j++) {  
            System.out.print(row.getCell(j) + "\t");  
        }  
        System.out.println();  
    }  
  
    //关闭流  
    excel.close();  
    fileInputStream.close();  
}


四、Apache POI实战

1.通过读取Excel方法获取一个城市对应的地址编号

2.通过写入Excel方法将一个城市未来的天气情况写入Excel表格中

4.1 创建一个获取天气的API

这里使用高德地图的天气API

创建应用,获取需要的key


4.2高德天气请求API与响应结果

请求API

由于这里的天气需要用到城市编码表,所以先下载好对应的城市编码表格

下载好后内容如下

 返回的Response

APIFOX工具(也可以用postman) 测试:

API地址:https://restapi.amap.com/v3/weather/weatherInfo?parameters

成功返回了数据说明前面一切操作都是对的。而后端访问则通过HttpClient形式访问


4.2 后端访问API获取数据

引入依赖

<dependency>  
    <groupId>org.apache.httpcomponents</groupId>  
    <artifactId>httpclient</artifactId>  
    <version>4.5.13</version>  
</dependency>

<dependency>
	<groupId>com.alibaba</groupId>
	<artifactId>fastjson</artifactId>
	<version>1.2.76</version>
</dependency>

有了API和城市编码表格,现在我们只需要在用户输入对应的城市或者区域的时候,遍历表格进行读取,如果有对应的区则返回adcode

测试类:

	@Test
	void WeatherTest() throws URISyntaxException, IOException {

// TODO:这里的key需要引用自己的
		String key = "xxxxxxx";
		String city = "110101";

		CloseableHttpClient httpClient = HttpClients.createDefault();

		URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");
		uriBuilder.addParameter("key", key);
		uriBuilder.addParameter("city", city);

		HttpGet httpGet = new HttpGet(uriBuilder.build());

		try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
			int statusCode = response.getStatusLine().getStatusCode();

			if (statusCode == 200) {
				HttpEntity entity = response.getEntity();
				String result = EntityUtils.toString(entity, "UTF-8");
				System.out.println(result);
			} else {
				System.out.println("Failed to retrieve data, status code: " + statusCode);
			}
		}
		httpClient.close();
	}

}


4.3 通过获取地方名称获取AdCode编码

	@Test
	void AdCodeQuery() throws IOException {

//		TODO:这里输入下载好的地址对照表
		String AMapFilePath = "E:\\AMap_adcode_citycode.xlsx";
//		需要查询的地址
		String address = "北京市";


		FileInputStream fileInputStream = new FileInputStream(AMapFilePath);
		XSSFWorkbook workbook = new XSSFWorkbook(fileInputStream);

		XSSFSheet sheetAt = workbook.getSheetAt(0);

		for (int i=1;i<sheetAt.getLastRowNum();i++){
			XSSFCell cell = sheetAt.getRow(i).getCell(0);
			String stringCellValue = cell.getStringCellValue();

			if (stringCellValue.equals(address)){
				XSSFCell cell1 = sheetAt.getRow(i).getCell(1);
				String adcode = cell1.getStringCellValue();
				System.out.println("查询到地区编号为"+adcode);
			}
		}

	}


4.4 使用Apache POI包装数据并将预测结果输出到Excel表格中

	@Test
	void WeatherTest() throws URISyntaxException, IOException {


// TODO:这里的key需要引用自己的
		String key = "xxxxxxx";
		String city = "110101";
		String extensions = "all";

		CloseableHttpClient httpClient = HttpClients.createDefault();

		URIBuilder uriBuilder = new URIBuilder("https://restapi.amap.com/v3/weather/weatherInfo");
		uriBuilder.addParameter("key", key);
		uriBuilder.addParameter("city", city);
		uriBuilder.addParameter("extensions",extensions);

		HttpGet httpGet = new HttpGet(uriBuilder.build());

		try (CloseableHttpResponse response = httpClient.execute(httpGet)) {
			int statusCode = response.getStatusLine().getStatusCode();

			if (statusCode == 200) {
				HttpEntity entity = response.getEntity();
				String jsonString = EntityUtils.toString(entity, "UTF-8");

//				通过POI写入文件
				
				// 将JSON字符串解析为Java对象
				Map<String, Object> map = JSON.parseObject(jsonString, new TypeReference<Map<String, Object>>() {});

				// 获取casts列表
				List<Map<String, Object>> casts = (List<Map<String, Object>>) ((List<Map<String, Object>>) map.get("forecasts")).get(0).get("casts");
				
				// 创建Excel工作簿
				Workbook workbook = new XSSFWorkbook();
				Sheet sheet = workbook.createSheet("Weather Forecasts");
				
				// 创建标题行
				Row headerRow = sheet.createRow(0);
				CellStyle headerStyle = workbook.createCellStyle();
				headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
				headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
				
				// 写入标题
				int cellIndex = 0;

				String[] columnHeaders = {"date", "week", "dayweather", "nightweather", "daytemp", "nighttemp", "daywind", "nightwind", "daypower", "nightpower", "daytemp_float", "nighttemp_float"};
				for (String columnHeader : columnHeaders) {
					Cell cell = headerRow.createCell(cellIndex++);
					cell.setCellValue(columnHeader);
					cell.setCellStyle(headerStyle);
				}

				// 创建数据行
				int rowIndex = 1;

				for (Map<String, Object> cast : casts) {
					Row row = sheet.createRow(rowIndex++);
					// 写入数据
					cellIndex = 0;
					for (String columnHeader : columnHeaders) {
						Cell cell = row.createCell(cellIndex++);
						cell.setCellValue(cast.get(columnHeader).toString());
					}
				}
				// 写入Excel文件
				try (FileOutputStream fileOut = new FileOutputStream("WeatherForecasts.xlsx")) {
					workbook.write(fileOut);
				}
				// 关闭工作簿
				workbook.close();

			} else {
				System.out.println("Failed to retrieve data, status code: " + statusCode);
			}
		}
		httpClient.close();
	}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1948706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vs code解决报错 (c/c++的配置环境 远端机器为Linux ubuntu)

参考链接&#xff1a;https://blog.csdn.net/fightfightfight/article/details/82857397 https://blog.csdn.net/m0_38055352/article/details/105375367 可以按照步骤确定那一步不对&#xff0c;如果一个可以就不用往下看了 目录 一、检查一下文件扩展名 二、安装扩展包并…

秒杀案例-分布式锁Redisson、synchronized、RedLock

模拟秒杀 源码地址前期准备创建数据库表导入数据dependenciespomControllerTSeckillProductTseckillProductServiceTseckillProductServiceImplTseckillProductMapperTseckillProductMapper.xml使用JMeter压力测试开始测试超卖现象原因解决办法更改数据库库存500进行JMeter压力…

linux_top命令打印结果_PID USER PR NI VIRT RES SHR S 什么意思

top命令输出结果 含义 top 命令是 Linux 和 Unix 系统中用于实时显示系统中各个进程的资源占用情况的工具。当你运行 top 命令并查看输出结果时&#xff0c;会看到类似下面的列&#xff08;具体的列可能因 top 的版本和配置而有所不同&#xff09;&#xff1a; PID: 进程ID&a…

NSS [NSSRound#4 SWPU]ez_rce

NSS [NSSRound#4 SWPU]ez_rce CVE-2021-41773 Apache Httpd Server 路径穿越漏洞 POC: GET /cgi-bin/.%2e/%2e%2e/%2e%2e/%2e%2e/bin/sh HTTP/1.1 Host: node4.anna.nssctf.cn:28690 Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Window…

C/C++教程合集(完)

C初级教程(非常基础&#xff0c;适合入门)入门C语言只需一个星期&#xff08;星期一&#xff09;入门C语言只需一个星期&#xff08;星期二&#xff09;入门C语言只需一个星期&#xff08;星期三&#xff09;入门C语言只需一个星期&#xff08;星期四)入门C语言只需一个星期&am…

NSS [NSSRound#13 Basic]flask?jwt?

NSS [NSSRound#13 Basic]flask?jwt? 开题 注册一下 要admin才能拿flag 看看是如何进行身份验证的 是flask session flask-unsign --decode --cookie .eJwtzjESwyAMBMC_UKfghJCEP-MRICZp7bjK5O9xkX6L_aR9HXE-0_Y-rnik_TXTlsiXEhUXleKGGGuG1jbmogrCEmNirZ7BEB-VJbTfIi-26hQD…

数据库实例迁移实践

背景 随着业务发展&#xff0c;数据库实例磁盘逐渐升高&#xff0c;告警频繁&#xff0c;且后续可能会对DDL产生影响&#xff08;尤其是借助ghost等工具执行的DDL&#xff09;。 该实例有多个库&#xff0c;则需要迁移其中的一个或几个单库到其他实例&#xff0c;为什么不做分…

【NPU 系列专栏 3.1 -- - NVIDIA 的 Orin 和 Altan 和 Thor 区别】

请阅读【嵌入式及芯片开发学必备专栏】 文章目录 NVIDIA Orin、Altan 和 ThorNVIDIA Orin 简介NVIDIA Orin 主要特点NVIDIA Orin 应用场景 NVIDIA Altan 简介NVIDIA Altan 主要特点NVIDIA Altan 应用场景 NVIDIA Thor 简介NVIDIA Thor 主要特点NVIDIA Thor 应用场景 与 Hopper …

CTF-NSSCTF题单[GKCTF2020]

[GKCTF 2020]CheckIN 这道题目考察&#xff1a;php7-gc-bypass漏洞 打开这道题目&#xff0c;开始以为考察反序列化&#xff0c;但实际并不是&#xff0c;这里直接用$_REQUEST传入了参数便可以利用了。这里出现了一个eval&#xff08;&#xff09;函数&#xff0c;猜测考察命…

暑期C++ 缺省参数

有任何不懂的问题可以评论区留言&#xff0c;能力范围内都会一一回答 1.缺省参数的概念 缺省参数是是声明或定义参数时为函数的参数指定一个缺省值。在调用该函数值时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参 看了上面定义后&#…

CogVLMv2环境搭建推理测试

引子 之前写过一篇CogVLM的分享&#xff0c;感兴趣的移步CogVLM/CogAgent环境搭建&推理测试-CSDN博客&#xff0c;前一阵子&#xff0c;CogVLMv2横空出世&#xff0c;支持视频理解功能&#xff0c;OK&#xff0c;那就让我们开始吧。 一、模型介绍 CogVLM2 系列模型开源了…

基于Vision Transformer的mini_ImageNet图片分类实战

【图书推荐】《PyTorch深度学习与计算机视觉实践》-CSDN博客 PyTorch计算机视觉之Vision Transformer 整体结构-CSDN博客 mini_ImageNet数据集简介与下载 mini_ImageNet数据集节选自ImageNet数据集。ImageNet是一个非常有名的大型视觉数据集&#xff0c;它的建立旨在促进视觉…

旗晟机器人仪器仪表识别AI智慧算法

在当今迅猛发展的工业4.0时代&#xff0c;智能制造和自动化运维已然成为工业发展至关重要的核心驱动力。其中智能巡检运维系统扮演着举足轻重的角色。工业场景上不仅要对人员行为监督进行监督&#xff0c;对仪器仪表识别分析更是不可缺少的一个环节。那么我们说说旗晟仪器仪表识…

AI模型大比拼:Claude 3系列 vs GPT-4系列最新模型综合评测

AI模型大比拼&#xff1a;Claude 3系列 vs GPT-4系列最新模型综合评测 引言 人工智能技术的迅猛发展带来了多款强大的语言模型。本文将对六款领先的AI模型进行全面比较&#xff1a;Claude 3.5 Sonnet、Claude 3 Opus、Claude 3 Haiku、GPT-4、GPT-4o和GPT-4o Mini。我们将从性能…

【Gin】精准应用:Gin框架中工厂模式的现代软件开发策略与实施技巧(下)

【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(下) 大家好 我是寸铁&#x1f44a; 【Gin】精准应用&#xff1a;Gin框架中工厂模式的现代软件开发策略与实施技巧(下)✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 本次文章分为上下两部分&…

智能家居全在手机端进行控制,未来已来!

未来触手可及&#xff1a;智能家居&#xff0c;手机端的全控时代 艾斯视觉的观点是&#xff1a;在不远的将来&#xff0c;家&#xff0c;这个温馨的港湾&#xff0c;将不再只是我们休憩的场所&#xff0c;而是科技与智慧的结晶。想象一下&#xff0c;只需轻触手机屏幕&#xf…

如何实现CPU最大处理效率

如何实现CPU最大处理效率 CPU,或称为中央处理器,是计算机中负责执行指令和处理数据的核心部件。它的工作原理可简单概括为"取指、译码、执行、存储"四个步骤,也称为计算机的指令周期。 取指(Fetch):在取指阶段,CPU从内存中获取下一条要执行的指令,并存放在指…

回顾网络路,心率就过速

笔者上网写作已满16年&#xff0c;其间加盟过国内互联网的知名网站自媒体至少在40至50家之多&#xff0c;但由于有的被已被勒令停刊了&#xff08;如《天涯论坛》&#xff09;&#xff0c;有的则因其改版而只保留了极少数擅于唱颂的写手&#xff08;如《强国论坛》&#xff09;…

【SpringCloud】企业认证、分布式事务,分布式锁方案落地-1

目录 HR企业入驻 HR企业入驻 - 认证流程解析 HR企业入驻 - 查询企业是否存在 HR企业入驻 - 上传企业logo与营业执照 HR企业入驻 - 新企业&#xff08;数据字典与行业tree结构解析&#xff09; 行业tree 行业tree - 创建节点 行业tree - 查询一级分类 行业tree - 查询子分…

计算存储背景与发展

随着云计算、企业级应用以及物联网领域的飞速发展&#xff0c;当前的数据处理需求正以前所未有的规模增长&#xff0c;以满足存储行业不断变化的需求。这种增长导致网络带宽压力增大&#xff0c;并对主机计算资源&#xff08;如内存和CPU&#xff09;造成极大负担&#xff0c;进…