开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
Computer Science
Computer Science

Apache POI 读取 Microsoft Office Excel 文档

Apache POI 项目的使命是创造和维护 Java API 操纵各种格式的文件,其中包括基于 Office Open XML 标准(OOXML)和微软的 OLE 2 Compound Document 格式(OLE2)。 总之,你可以使用 Java 读写 MS Excel 文件。换句话说就是如果你希望要对 Microsoft Office 的一些文档用 Java 来处理,那么你需要使用 Apache POI 项目。 我们在这里只对 Excel 的读取进行一些小的代码。 HSSF 和 XSSF HSSF 被用来处理早期版本,这个版本为:Excel '97(-2007) XSSF 被用来处理近期的版本,Excel 2007 OOXML (.xlsx) 。 简单来说就是你的 Excel 版本为 07 年以后的版本,使用 XSSF 就可以了,换句话说目前使用 XSSF 比较多。 XSSF 读取数据 使用 XSSF 读取数据的方法比较简单。 使用下面几行代码就可以了。 try (InputStream inp = new FileInputStream("workbook.xls")) { //InputStream inp = new FileInputStream("workbook.xlsx"); Workbook wb = WorkbookFactory.create(inp); Sheet sheet = wb.getSheetAt(0); Row row = sheet.getRow(2); Cell cell = row.getCell(3); } 简单来说就是首先将文件读取为 InputStream 。 使用 InputStream 来创建一个 Workbook 对象,这时候你需要使用 WorkbookFactory 来创建。     当你获得 WorkbookFactory 对象后,就等于已经将需要读取的 Excel 文件放到对象中了。 读取顺序是从 Workbook 对象中,通过 getSheetAt 方法来处理你希望处理的 sheet,因为在 Excel 表中可以有多个 sheet,这里如果你指定为 0 的话,表示根据物理和逻辑算法确定的第一个 sheet。 当你获得 sheet 对象后,你就可以从 sheet 中读取 row 对象了。 row 对象就等于表格中的一行,在一个 Excel 表中可以有很多行。当你获得这一行的对象后,你会有很多的列。 那么你需要使用 getCell 来获得指定的列。 当你获得指定的列以后,你就可以获得你需要的数据了。 整体来说,Workbook 的对象定义还是非常明确的。 遍历数据 官方的文档中,使用了 3 for 循环来遍历。 代码如下: for (Sheet sheet : wb ) { for (Row row : sheet) { for (Cell cell : row) { // Do something here } } } 这个代码看起来还是挺丑的,按照官方的说法,还是可以使用迭代( Iterator)的 因为官方还提供了 workbook.sheetIterator() , sheet.rowIterator() , 和 row.cellIterator() 几个迭代器。 例如我们使用了下面这个方法: public static List<String> getXLSXInputFileRowList(File inputFile) { List<String> dataList = Lists.newArrayList(); try { FileInputStream inputStream = FileUtils.openInputStream(inputFile); Workbook wb = WorkbookFactory.create(inputStream); Sheet sheet = wb.getSheetAt(0); Iterator<Row> iterator = sheet.rowIterator(); // LOOP Get Cell while (iterator.hasNext()) { Row row = iterator.next(); Cell cell = row.getCell(0); cell.getStringCellValue(); dataList.add(cell.getStringCellValue()); logger.debug("Cell Data - [{}]", cell.getStringCellValue()); } logger.debug("The Size of XLSX file count: {}", dataList.size()); } catch (IOException ex) { logger.error("XLSX File process error.", ex); } // CLEAN CollectionUtils.filter(dataList, PredicateUtils.notNullPredicate()); return dataList; } 在这个方法中我们就使用了 rowIterator 迭代器。 假设我们处理的 Excel 数据只有…

2020年12月03日 0Comments 823Browse 0Like Read more
Computer Science

Discourse 如何配置 GitHub 登录方式

访问下面的网站:https://github.com/settings/developers 然后单击左侧的 OAuth Apps ,然后选择 New OAuth App 。     然后填入需要的字段。     配置 GitHub 请确定你的 Callback URL 在你的域名后使用使用路径 /auth/github/callback。 例如我们网站的地址为 https://www.ossez.com,那么我们需要在 Homepage URL 中,填写我们网站的地址。 在 Callback URL 填入的返回 URL 为: https://www.ossez.com/auth/github/callback。 (可选的)这个选项是可选的,你可以上传你网站的 Logo 到 GitHub 上。     当你创建成功应用后,你应该看到 Client ID 和 Client Secret 这 2 个参数,你需要拷贝这个参数添加到你的 Discourse 站点中。 配置 Discourse Discourse 站点中的字段为:github_client_id 和 github_client_secret 然后在 Discourse 中启用 enable github logins 设置。     完成上面的设置后,你应该就可以在你的网站上使用 GitHub 登录了。 如下面的界面显示的一样,你可以在登录或者注册的时候使用你已经在 GitHub 上成功注册和使用的账号了。 针对技术网站来说可能会带来一点点的小优势。 https://www.ossez.com/t/discourse-github/750

2020年12月03日 0Comments 767Browse 0Like Read more
Computer Science

Docker 添加容器到一个网络

要创建一个安全并且能够协同运行的 Web 应用程序,你需要创建一个网络。 通过网络,在默认情况下为容器提供了完全独立的环境。在你第一次运行一个容器的时候,你可以将容器添加到一个网络中。 例如,我们希望运行一个容器来运行 PostgreSQL 数据库,并且传递 --net=my_bridge 标记来到你新网络的连接中,可以运行下面的命令: $ docker run -d --net=my_bridge --name db training/postgres 如果你检查你的 my_bridge ,你可以看到已经有一个容器被添加(attached)上去了。 你也可以检查你的容器来查看连接在哪里: $ docker inspect --format='{{json .NetworkSettings.Networks}}' db {"my_bridge":{"NetworkID":"7d86d31b1478e7cca9ebed7e73aa0fdeec46c5ca29497431d3007d2d9e15ed99", "EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"10.0.0.1","IPAddress":"10.0.0.254","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}} 现在,你可以使用你熟悉的命令来启动一个 Web 应用程序了。这次不需要指定一个网络。 $ docker run -d --name web training/webapp python app.py     你的 web 应用运行在哪个网络下呢?可以检查应用来确定这个应用运行在默认的 桥接(bridge) 网络。 $ docker inspect --format='{{json .NetworkSettings.Networks}}' web {"bridge":{"NetworkID":"7ea29fc1412292a2d7bba362f9253545fecdfa8ce9a6e37dd10ba8bee7129812", "EndpointID":"508b170d56b2ac9e4ef86694b0a76a22dd3df1983404f7321da5649645bf7043","Gateway":"172.17.0.1","IPAddress":"10.0.0.2","IPPrefixLen":24,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:02"}} 然后获得你 web 应用的 IP 地址。 $ docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web 172.17.0.2 现在,可以打开一个 shell 来运行 db 容器: $ docker container exec -it db bash root@a205f0dd33b2:/# ping 172.17.0.2 ping 172.17.0.2 PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data. ^C --- 172.17.0.2 ping statistics --- 44 packets transmitted, 0 received, 100% packet loss, time 43185ms 在过一段时间后,可以使用 CTRL-C 来终止 ping 命令,请注意 ping 显示终止了。 这是因为这个 2 个容器运行在不同的网络中,你可以使用 exit 命令来关闭容器进行修复。 Docker 网络运行你附件一个容器到多个你愿意的网络上。你甚至可以添加到一个正在运行的容器上。 运行下面的命令,将 web 应用添加到 my_bridge 网络上。 $ docker network connect my_bridge web     打开 shell 然后再次进入 db 应用,然后尝试使用 ping 命令。这次你可以仅仅使用容器的名字 web 就可以了,而不需要使用 IP 地址。 $ docker container exec -it db bash root@a205f0dd33b2:/# ping web PING web (10.0.0.2) 56(84) bytes of data. 64 bytes from web (10.0.0.2): icmp_seq=1 ttl=64 time=0.095 ms 64 bytes from web (10.0.0.2): icmp_seq=2 ttl=64 time=0.060 ms 64 bytes from web (10.0.0.2): icmp_seq=3 ttl=64 time=0.066 ms ^C --- web ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 0.060/0.073/0.095/0.018 ms 命令 ping 显示连接到了一个不同的 IP 地址,这个在 my_bridge 上的 IP 地址与 bridge 网络上的 IP 地址是不同的。

2020年12月02日 0Comments 705Browse 0Like Read more
Computer Science

Docker 创建你自己的桥接网络

Docker 引擎能够原生支持桥接网络(bridge networks)和覆盖网络(overlay networks)。 桥接网络被限制用于一个独立主机运行的 Docker 引擎。覆盖网络能够包含有多个主机,这个有更多的高级特性。 下面的例子显示了如何创建一个桥接网络: $ docker network create -d bridge my_bridge 参数 -d 用于告诉 Docker 在新的网络中使用 桥接(bridge) 驱动。 名字 bridge 是默认使用的网络名字,在创建的时候可以不指定这个参数,那么将会使用默认的网络名字来创建。 当你创建成功后,可以使用下面的命令来查看你机器中的网络配置: $ docker network ls NETWORK ID NAME DRIVER 7b369448dccb bridge bridge 615d565d498c my_bridge bridge 18a2866682b8 none null c288470c46f6 host host 如果你使用下面的命令检查网络的话,你会看到在这里面没有任何内容。 $ docker network inspect my_bridge [ { "Name": "my_bridge", "Id": "5a8afc6364bccb199540e133e63adb76a557906dd9ff82b94183fc48c40857ac", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Config": [ { "Subnet": "10.0.0.0/24", "Gateway": "10.0.0.1" } ] }, "Containers": {}, "Options": {}, "Labels": {} } ]     桥接网络的情况,请参考上图的配置。 https://www.ossez.com/t/docker/747

2020年12月02日 0Comments 669Browse 0Like Read more
Computer Science

GitHub 如何为项目设置许可证

登录你 GitHub 中的项目。然后选择 Add File(添加文件)       输入文件名 然后输入文件名 LICENSE 或 LICENSE.md       输入字符后,可以在后面选择需要的许可证。       按照提示选择需要的许可证就可以了。       当完成所有上面的操作后,就完成了为你的项目指定许可证。 https://www.ossez.com/t/github/746  

2020年12月01日 0Comments 826Browse 0Like Read more
Computer Science

GitHub 如何让你的提交显示被校验

如下面的图片显示的,在提交的时候,如何让我的提交显示被校验呢。     其实流程也不是非常复杂,按照下面的过程来进行配置就可以了。 创建 PGP 上传 PGP 到 GitHub 提交时候配置 PGP 创建 PGP 如果你是使用 Windows 来进行安装的话,你需要首先下载安装 gnupg。有关下载安装 gnupg 的方法和过程,请参考页面:如何在 Windows 上创建一个新的 GPG key 中的内容。 当你完成安装后,我们需要运行 Kleopatra 来创建一个 PGP Key。 选择 Kleopatra 右上角的文件,然后选择创建。     在弹出的对话框中,选择创建一个 OpenPGP Key。     在最后的对话框中,输入你的名字和邮件地址。 请注意,你的邮件地址需要和你在 GitHub 上已经校验的邮件地址一致,为了方便,我们用户名也会选择和 GitHub 提交试用的用户名一致,你也可以使用不同的用户名。 不需要使用高级配置,默认的就可以。     单击下一步继续来完成创建。     会提示要求输入密码,这个密码是这个 key 访问的密码,你可以使用一个简单点的。     单击完成,显示创建的 PGP Key,然后在后面的控制台上也可以看到我们创建的 Key。     选择你要的 Key 后导出,你就可以导出成一个 asc 格式的文件,这个文件是一串秘钥。这个就是我们需要上传到 GitHub 上的。 更新 GitHub 在获得创建成功的 asc key 以后,可以用记事本打开。 然后拷贝加密字符串,登录你的 GitHub ,然后选择设置。 在设置页面中,选择 GPG Key。     在弹出的界面中,选择创建新的 GPG     然后将在上一步上拷贝的 Key 字符串,复制粘贴到这里。     然后单击添加 Key 来完成 Key 的添加过程。 如果一切顺利,那么你将会看到你的 key ID。     更新 Git 配置 你可以配置全局的参数也可以针对特定的仓库进行配置。 这里我们来针对特定的仓库来进行配置,找到你需要配置的已经克隆到你本地的仓库。 然后在这个参考中打开:.git\config 文件。 在 [user] 中添加:signingkey = 这个字符串就是你在 Github 上看到的 ID。 添加: [commit] gpgsign = true 添加: [gpg] program = "C:/Program Files (x86)/GnuPG/bin/gpg.exe" gpg 的配置需要指派到 exe 可执行文件,这个用来对签名进行校验的。 完整的配置如下: [user] signingkey = 5E51AA59A72629C1 [commit] gpgsign = true [gpg] program = "C:/Program Files (x86)/GnuPG/bin/gpg.exe" 如果你的配置中的 user 里面还配置了用户名和 Email 地址的话,你自己在下面添加就行,不需要删除。   然后保存后,对代码进行修改,尝试提交修改的代码到仓库中,以确定是否生效了。 https://www.ossez.com/t/github/744

2020年12月01日 0Comments 718Browse 0Like Read more
Computer Science

如何在 Windows 上创建一个新的 GPG key

在 Windows 中创建新的 GPG Key,你需要安装一个称为 gnupg 小工具。 下载的地址为:https://www.gnupg.org/download/ 针对 Windows ,你可以下载 Gpg4win 这个版本。     双击运行安装 下载到本地后,可以双击下载的程序进行安装。 在安装的时候,可能会询问你权限的问题。 选择语言版本 在这里选择默认的英文版本就可以了。 下一步继续 单击下一步来继续安装过程。 安装组件 选择默认的安装组件,然后下一步进行安装。 安装路径 使用默认的安装路径就可以了。 安装进程 在这里需要等一下,等待安装完成。 安装完成 单击安装完成按钮来完成安装。 然后你可以看到运行的 Kleopatra,我们是需要使用这个来创建 PGP Key 的。   https://www.ossez.com/t/windows-gpg-key/745

2020年12月01日 0Comments 879Browse 0Like Read more
Computer Science

Protocol Buffers 开发者指南

欢迎来到 protocol buffers 的开发者指南。protocol buffers 是一个语言中立,平台中立针对通讯协议,数据存储和其他领域中对结构化数据进行序列化的扩展方法。     本文档主要针对的是 Java,C++ 或 Python 的开发人员希望在开发的应用程序中使用 Protocol Buffers。这个有关 Protocol Buffers 摘要性的介绍将会告诉你如何开始使用 Protocol Buffers。 如果你希望更加深入的了解有关 Protocol Buffers 的内容,你可以进入 tutorials 或者 protocol buffer encoding 页面来详细了解。 有关 API 的参考文档,请参考页面:reference documentation 这里提供了所有这 3 种语言的参考,同时也针对 .proto language 和 style 提供相关的指南。 什么是 Protocol Buffers Protocol buffers 是对结构化数据序列化的一个灵活,高效,自动化工具 —— 你可以将 Protocol buffers 想象成 XML,但是体积更小,更快也更加简单。 你可以自己定义你的结构化数据,然后你可以使用特定的代码生成工具来非常容易对你的结构化数据进行读取和写入。这些数据的读取和写入可以是一系列的数据流和使用不同的计算机程序语言。 你甚至可以在不对已经部署的程序进行破坏的情况下更新你的数据结构。 Protocol Buffers 是如何进行工作的 你需要制定你希望如何将你的数据进行序列化。你是通过 proto 文件来定义你的消息结构化数据的。 每一 protocol buffer message 是一个小的信息记录逻辑,这个消息中包含有一系列的名字,变量对照序列。 下面是一些基本的.proto 文件,这些文件中定义了一个消息,这个消息包含有一个 person 信息: message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; } 通过上面你可以看到这个消息的格式非常简单—— 每一个消息类型都有一个或者多个唯一进行编号的字段,每一个字段包含有一个名字和变量类型。 变量可以为数字(整形或者浮点型)(numbers),布尔类型(booleans),字符串(strings),原生二进制(raw bytes)甚至其他的 protocol buffer 消息类型,能够允许你分级的结构化你的数据。 你可以将字段指定为可选字段(optional fields),必须字段(required fields)和重复字段(repeated fields)。你可以从下面的 Protocol Buffer Language Guide 页面中找到更多有关 .proto 的定义。 一旦你成功定义了你的消息,你可以针对你使用的语言使用你定义的 .proto 来运行 protocol buffer 编译器(protocol buffer compiler)来生成数据访问类。 针对每一个字段,在数据访问类中提供了简单的访问方法(例如 name() 和 set_name())和序列化到原生 2 进制数据和从原生 2 进制数据反序列化的方法。 针对上面的定义,如果你现在使用的是 C++ 语言的话,当你把消息定义进行编译后,你将会得到一个称为 Person 的类。对数据进行序列化和从序列化的数据中(protocol buffer 消息)重新获得 Person 数据。 然后你可以写一些类似 Person person; 的代码。 Person person; person.set_name("John Doe"); person.set_id(1234); person.set_email("jdoe@example.com"); fstream output("myfile", ios::out | ios::binary); person.SerializeToOstream(&output); 随后,你可以对消息进行读取: fstream input("myfile", ios::in | ios::binary); Person person; person.ParseFromIstream(&input); cout << "Name: " << person.name() << endl; cout << "E-mail: " << person.email() << endl; 你可以向你的消息中添加新的字段而不会损坏老的消息。这是因为在老的消息处理中,针对新的字段是完全忽略掉的。因此,如果你在你的通讯协议中使用 protocol buffers 为数据结构的话, 你可以对你的协议和消息进行扩展而不需要担心老的代码没有办法编译通过,或者损坏老的代码。 你可以访问 API Reference section 页面中的内容来了解完整 protocol buffer 代码的生成和使用。 你也可以在 Protocol Buffer Encoding 页面中了解更多protocol buffer 消息是如何进行编码的。 为什么不使用 XML 针对 XML 来说 Protocol Buffers 具有更多的优势来对序列化结构数据。 更加简单 小于 XML 3 到 10 倍 快于 XML 20 到 100 倍 松耦合 使用程序工具来创建数据访问类,使数访问类更加简单 假设,你需要讲 person 这个数据进行定义,在 XML 你需要使用: <person> <name>John Doe</name>…

2020年11月30日 0Comments 764Browse 0Like Read more
Computer Science

MariaDB 显示数据库表的结构

如何能在 MariaDB 数据库中显示数据库表: +--------------+--------------------+----------------------------+------------------------+----------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | +--------------+--------------------+----------------------------+------------------------+----------+ | def | information_schema | utf8 | utf8_general_ci | NULL | | def | mysql | latin1 | latin1_swedish_ci | NULL | | def | ossez_bbs | utf8 | utf8_general_ci | NULL | | def | ossez_ucenter | utf8 | utf8_general_ci | NULL | | def | performance_schema | utf8 | utf8_general_ci | NULL | | def | test | latin1 | latin1_swedish_ci | NULL | +--------------+--------------------+----------------------------+------------------------+----------+ 可以使用下面的 SQL 来进行查看即可。 SELECT * FROM INFORMATION_SCHEMA.SCHEMATA;     上图显示的是执行结果。 https://www.ossez.com/t/mariadb/741

2020年11月29日 0Comments 1082Browse 0Like Read more
Computer Science

Docsify 的边栏目录如何设置

如下图中的文档中的 docsify 边栏是如何设置的?     配置方法 在你的项目的 index.html 文件中,添加参数: loadSidebar: true 然后再在项目中添加一个 _sidebar.md 文件,这个文件的格式为: - CWIKIUS 文档概述 - [文档介绍和快速链接](README.md) - [公众平台](CONTACT.md) - Gradle - [Deploy](deploy.md) - 其他小工具 - [JWT](jwt/README.md) - [Awesome docsify](awesome.md) - [Changelog](changelog.md) 采用分级的方式链接到你的项目文档路径中。     然后保存提交就可以了。 https://www.ossez.com/t/docsify/740

2020年11月29日 0Comments 746Browse 0Like Read more
1…118119120121122…237
Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (516)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1