有时候我们需要从Excel文件中读取数据,或者我们为了商务或者财政的目的生成Excel格式的报表Java没有对 *** 作Excel文件提供内在的支持,所以我们需要寻找开源的APIs当我开始寻找 *** 作Excel的APIs时候,大部分人建议使用JExcel或者Apache POI
在深入研究后,我发现由于以下主要原因Apache POI是正确的选择还有些关于高级特性的原因,但是我们不深入太多细节
1)Apache基金的支持
2)JExcel不支持xlsx格式而POI既支持xls格式又支持xlsx格式
3)Apache POI是基于流的处理,因此更适合大文件和要求更少的内存
Apache POI对处理Excel文件提供了强大的支持,并且能处理xls和xlsx格式的电子表格
关于Apache POI一些重要的地方:
1)Apache POI包含适合Excel97-2007(xls文件)的HSSF实现
2)Apache POI XSSF实现用来处理Excel2007文件(xlsx)
3)Apache POI HSSF和XSSF提供了读/写/修改Excel表格的机制
4)Apache POI提供了XSSF的一个扩展SXSSF用来处理非常大的Excel工作单元SXSSF API需要更少的内存,因此当处理非常大的电子表格同时堆内存又有限时,很合适使用
5)有两种模式可供选择--事件模式和用户模式事件模式要求更少的内存,因为用tokens来读取Excel并处理用户模式更加面向对象并且容易使用,因此在我们的示例中使用用户 模式
6)Apache POI为额外的Excel特性提供了强大支持,例如处理公式,创建单元格样式--颜色,边框,字体,头部,脚部,数据验证,图像,超链接等
Apache POI的Maven依赖
[java] view plaincopy
<span style="font-size:14px;"><dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi</artifactId>
<version>310-FINAL</version>
</dependency>
<dependency>
<groupId>orgapachepoi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>310-FINAL</version>
</dependency></span>
Apache POI的当前版本是310-FINAL如果你使用单独的java应用,添加jars根据下面的
读取Excel文件
假设我们有一个叫Samplexlsx的Excel文件,里面有两个sheet并且下面中的数据我们想要读取这个Excel文件并且创建Countries listsheet1有些额外的数据,当我们解析时会忽略它
我们的国家(Country)java bean如下:
Countryjava
[java] view plaincopy
package comjournaldevexcelread;
public class Country {
private String name;
private String shortCode;
public Country(String n, String c){
thisname=n;
thisshortCode=c;
}
public String getName() {
return name;
}
public void setName(String name) {
thisname = name;
}
public String getShortCode() {
return shortCode;
}
public void setShortCode(String shortCode) {
thisshortCode = shortCode;
}
@Override
public String toString(){
return name + "::" + shortCode;
}
}
读取Excel文件并创建Countries list代码如下:
ReadExcelFileToListjava
[java] view plaincopy
package comjournaldevexcelread;
import javaioFileInputStream;
import javaioIOException;
import javautilArrayList;
import javautilIterator;
import javautilList;
import orgapachepoihssfusermodelHSSFWorkbook;
import orgapachepoissusermodelCell;
import orgapachepoissusermodelRow;
import orgapachepoissusermodelSheet;
import orgapachepoissusermodelWorkbook;
import orgapachepoixssfusermodelXSSFWorkbook;
public class ReadExcelFileToList {
public static List<Country> readExcelData(String fileName) {
List<Country> countriesList = new ArrayList<Country>();
try {
//Create the input stream from the xlsx/xls file
FileInputStream fis = new FileInputStream(fileName);
//Create Workbook instance for xlsx/xls file input stream
Workbook workbook = null;
if(fileNametoLowerCase()endsWith("xlsx")){
workbook = new XSSFWorkbook(fis);
}else if(fileNametoLowerCase()endsWith("xls")){
workbook = new HSSFWorkbook(fis);
}
//Get the number of sheets in the xlsx file
int numberOfSheets = workbookgetNumberOfSheets();
//loop through each of the sheets
for(int i=0; i < numberOfSheets; i++){
//Get the nth sheet from the workbook
Sheet sheet = workbookgetSheetAt(i);
//every sheet has rows, iterate over them
Iterator<Row> rowIterator = sheetiterator();
while (rowIteratorhasNext())
{
String name = "";
String shortCode = "";
//Get the row object
Row row = rowIteratornext();
//Every row has columns, get the column iterator and iterate over them
Iterator<Cell> cellIterator = rowcellIterator();
while (cellIteratorhasNext())
{
//Get the Cell object
Cell cell = cellIteratornext();
//check the cell type and process accordingly
switch(cellgetCellType()){
case CellCELL_TYPE_STRING:
if(shortCodeequalsIgnoreCase("")){
shortCode = cellgetStringCellValue()trim();
}else if(nameequalsIgnoreCase("")){
//2nd column
name = cellgetStringCellValue()trim();
}else{
//random data, leave it
Systemoutprintln("Random data::"+cellgetStringCellValue());
}
break;
case CellCELL_TYPE_NUMERIC:
Systemoutprintln("Random data::"+cellgetNumericCellValue());
}
} //end of cell iterator
Country c = new Country(name, shortCode);
countriesListadd(c);
} //end of rows iterator
} //end of sheets for loop
//close file input stream
fisclose();
} catch (IOException e) {
eprintStackTrace();
}
return countriesList;
}
public static void main(String args[]){
List<Country> list = readExcelData("Samplexlsx");
Systemoutprintln("Country List\n"+list);
}
}
这个程序很容易明白,主要步骤如下:
1)根据文件类型(xls与xlsx)创建Workbook实例,xlsx用XSSFWorkbook,xls用HSSFWorkbook我们可以基于文件名字使用工 厂模式创建一个包装类来创建Workbook实例
2)使用Workbook getNumberOfSheets()来获取sheet的数量,然后循环解析每一个sheet使用getSheetAt(int i)方法获取 Sheet实例
3)获取Row和Cell迭代器来获取每一个Cell对象Apache POI在这里使用了迭代器模式
4)使用switch-case根据Cell的类型来处理它
要说数据来源,首先得对地图数据做一个分类,因为不同分类的数据,其来源,采集方法都是有大不同的。
要明白地图的数据分类,必须先理解一个概念,就是地图图层的概念:
如上图,电子地图对我们实际空间的表达,事实上是通过不同的图层去描述,然后通过图层叠加显示来进行表达的过程。
对于我们地图应用目标的不同,叠加的图层也是不同的,用以展示我们针对目标所需要信息内容。
其次呢,我引入一下矢量模型和栅格模型的概念,GIS(电子地图)采用两种不同的数学模型来对现实世界进行模拟:
矢量模型:同多X,Y(或者X,Y,Z)坐标,把自然界的地物通过点,线,面的方式进行表达
栅格模型(瓦片模型):用方格来模拟实体
目前在互联网公开服务中,或者绝大多数手机APP里看到的,都是基于栅格(瓦片)模型的地图服务,比如大家看到的百度地图或者谷歌地图,其实对于某一块地方的描述,都是通过10多层乃是20多层不同分辨率的所组成,当用户进行缩放时,根据缩放的级数,选择不同分辨率的瓦片图拼接成一幅完整的地图(由于一般公开服务,瓦片图都是从服务器上下载的,当网速慢的时候,用户其实能够亲眼看到这种不同分辨率的切换和拼接的过程)
对于矢量模型的电子地图来说,由于所有的数据以矢量的方式存放管理,事实上图层是一个比较淡薄的概念,因为任何地图元素和数据都可以根据需要自由分类组成,或者划分成不同的图层。各种图层之间关系可以很复杂,例如可以将所有的道路数据做成一个图层,也可以将主干道做成一个图层,支路做成另外一个图层。图层中数据归类和组合比较自由。
而对于栅格模型(瓦片图)来看,图层的概念就很重要的,由于图层是生成制作出来,每个图层内包含的元素相对是固化的,因此要引入一个底图的概念。也就是说,这是一个包含了最基本,最常用的地图数据元素的图层,例如:道路,河流,桥梁,绿地,甚至有些底图会包含建筑物或者其他地物的轮廓。在底图的基础上,可以叠加各种我们需要的图层,以满足应用的需要,例如:道路堵车状况的图层,卫星图,POI图层等等。
底图通常是通过选取必要地图矢量数据项,然后通过地图美工的工作,设定颜色,字体,显示方式,显示规则等等,然后渲染得到了(通常会渲染出一整套不同分辨率的瓦片地图)
当然,即便在瓦片图的服务中,在瓦片底图之上,依然能够覆盖一些简单的矢量图层,例如道路走向(导航和线路规划必用),POI点图层(找个饭馆加油站之类的)。只不过瓦片引擎无法对所有地图数据构建在同一个空间数据引擎之中,比较难以进行复杂的地图分析和地图处理。
那么既然瓦片图引擎有那么多的限制和缺陷,为什么不都直接使用矢量引擎呢?因为瓦片图引擎有着重大的优势:
1 能够负载起大规模并发用户,矢量引擎要耗费大量的服务器运算资源(因为有完整的空间数据引擎),哪怕只是几十上百的并发用户,都需要极其夸张的服务器运算能力了。矢量引擎是无法满足公众互联网服务的要求的。
2 由于地图美工介入的渲染工作,瓦片图可以做得非常好看漂亮和易读,比较适合普通用户的浏览
附:一张矢量地图截图:
其实主要就是为了引入图层和底图的概念,以方便说明下面的地图数据分类
为了说明数据的来源和采集渠道,采集方法,将地图数据分为以下几个类型:
1 底图数据: 其实就是地图中最基本的地物外形数据及一定的相关附加信息(例如道路名,河流名等)。事实上随着遥感和航拍卫拍技术的进步,这部分数据依赖实地采集的比例已经越来越小,商业地图数据商,尤其以高德为代表,处于成本收益考量,基本已经很少采用实地采集的方式了。这部分的数据主要来源于3种:
官方地图:严格来说,这不能说是一种单独的渠道,因为官方地图的数据本身,也是来源于下面的两种渠道,但是官方地图一般来源于政府相关部门的权威测绘和发布,因此也单算成一种渠道。当然,需要说明的是,地图厂商能从国家权威部门拿到或者买到的地图,要比我们日常在街上商店里买到的地图要精细丰富很多,当然,很多时候也是用电子格式提供的。
当然,无论任何国家,真正高精度的地图(例如1:200比例或更高)是受限制不会对外公布的。(相对应给大家参照的是,我国规定互联网上可以公开发布的地图,最高精度是1:10000)
实地外采:说白就是测绘人员利用专业的仪器仪表,在实地环境中测绘所得到的。这样的采集方法耗时耗人都非常厉害,一则成本高,二则周期长,三则是采环境要求高(去喜马拉雅山去测测能弄吐血了),而且未必能够完全跟得上中国现在的城市变化。但是优点在于精度高,置信度,准确度非常高。这是国家测绘部门主要采用的手段,对于像北京市这样一个城市来说,一般几年才会完整重新测绘一轮。一般对于大多数商用测绘时,只是用在少数局部需要时,重点测绘才用得到。
这个大家马路上应该也偶尔能见到
当然,在精度和准确度要求没有那么高的地方,实地采集也可以使用一些成本更低更便捷的工具,而不是专业测绘设备。例如用携带高精度GPS或其他定位的手持智能设备步行以绘制轮廓等。
航片卫片制作:就是通过自己拍摄或者购买的高精度航空照片或者卫星照片或者遥感照片,在此作为底片的基础上进行人为的矢量标注和勾勒,从而形成自己的矢量数据。现在的航片或者遥感片的精度已经可以很高了,一般来说做到精度在005米的程度已经很容易。高德自己的航片据说已经可以做到003米的精度,对于商用地图数据来说,通常已经够用了。即便作为国家权威测绘,在大量荒郊野岭的测绘,也主要依赖于这种手段。
目前常用的航拍或者卫拍手段包括机载数码摄像,机载遥感以及三维激光扫描(主要用于3D地图数据采集)
005米精度航片
卫片路网标注
航片/卫片标注和勾勒,前面是在底片上的 *** 作,后面是勾勒标注后得到的矢量图
数据加工制作示意图(来源于高德某公开资料)
从这部分数据来说,百度是没有自己的采集生产能力的,也没有执照(没有测绘资质)。百度的这一块数据主要是向四维图新买的。
国内这一块的数据,主要有两家供应商,就是高德和四维图新。
四维图新和国家测绘单位的关系非比寻常,其数据依赖国家测绘单位供给的占大头(当然也有互相供给的)。
高德也有一部分数据来源于国家测绘单位的供给,但是高德自己的航拍制作的能力还是不错的(还承担过一些国家测绘机关的测绘任务),相对来说,依赖国家测绘单位数据的比例要低一些。
总的来说,这部分数据的采集生产,在中国需要国家认定的资质,有资质的除了国家测绘机关以外,商业机构本来就不太多,而真正在这个数据供给市场上活跃的,现在主要就是高德和四维图新这两家。
其他无论是谷歌地图也好,苹果地图也好,这部分的数据,基本上都是从上述两家购买的。
2 POI数据:严格来说属于矢量数据,不过是最简单的矢量数据,换句话来说就是坐标点标注数据。也是电子地图上最常用的数据图层。
我们日常在电子地图上所使用的数据都是POI数据(就是地图上常见的那种标个气球的点)。
POI数据只是信息关联坐标点的数据,不涉及到线和面,是最简单的矢量数据,用于简单的地点标注而不需要相应地物轮廓的需求。
POI数据的内容五花八门,一般POI数据的供应商提供的POI数据都是日常常用的场所数据,例如饭店,商店,加油站,银行等日常常用设施。
当然,在一些特殊的地图应用领域,也可以委托这些数据供应商或者自行去专门采集特殊用途的POI数据,例如井盖,消防栓等
税务GIS系统标注企业及纳税信息
值得指出的是,POI数据的编辑更新简单,同时也经常用于动态数据标注,最经典的莫过于车辆定位标注。
POI数据的采集和生产来源五花八门,不能尽述,总的来说,主要有以下几种:
a)通过整合GPS的摄像机,步行或者车行,进行扫街持续拍摄,回去以后,再根据拍摄结果手工进行输入和标注,这种方式适合于大规模的进行采集标注,效率高,成本低,车行居多,尤其适合沿街的店面和场所的采集和标注,是目前数据采集供应商的主要采集手段之一
b)通过专职或者兼职人员,使用手持含GPS的智能设备(比如智能手机),进行拍摄(主要是为了取证),输入,提交,进行采集。这种采集方式,大多用于上述方法a的补充。在一些车辆不能达到的地方,或者商户设施变动频繁的某些区域使用
c)地址反向编译:通过门牌地址号码,以及矢量地图中的道路数据,运用算法进行定位标注。这种标注精度相对最低,准确性也不高,但是成本非常低。用在不需要特别高精度,成本控制也比较严的采集领域。大家在地图服务搜索框中输入地址门牌号,可以直接出现标注点,用的就是这个技术。
d)互联网或者企业获取:直接从一些专业类服务网站上抓取或者购买(例如大众点评,携程),或者直接从大家在其公开的地图服务上的标注中进行筛选和获取。这就是google,百度,高德自己免费向社会开放其地图服务所能够获得的利益。尤其对于开放API免费企业客户的使用,这种获取是很有价值的。
国内POI数据的供应商没有太多资质限制,相对底图数据供应商,要多很多,例如图吧等都是POI数据供应商,当然四维图新和高德也提供POI数据,每个POI数据供应商,都有其自己的分类方式,数据定义等内容。很多时候,大家也互相买来买去,互补有无。
百度地图这方面的数据,主要来自四维图新和道道通,当然也有其他来源,甚至有少量的自产数据。
高德地图这方面的数据以自产为主,辅以向一些专业服务商购买(口碑网,大众点评,携程,乐途,搜房)
3 其他数据图层或数据:常见的有卫图图层,交通状况图层,三维图,街景图。专业一些的领域有楼盘图,室内图,气温分布图,商圈分布图,地形图,水文图等等。
微观地图
楼盘市占图
地址灾害图
电视有限网络分布管理图
人口密度图
人口密度图
三维实景地图
三维数据示意图
之所以贴这么多五花八门的图,主要就是为了说明,基于电子地图的数据图层真的是应用范围和应用领域极广,不同的图层,代表了不同的数据,这个领域有大量专业性的应用和数据,其采集方法,来源渠道也五花八门,难以尽述。
简单说几种常用数据的来源:
a)交通拥堵数据:这个一般来源于专业的数据供应商,这些供应商和交通部门有较深合作,其数据采集主要依赖于在出租车上安装的GPS来采集实时车速为主,或者通过摄像头,红外探头,雷达测速测量车速为辅
b)三维数据:主要依赖激光扫描以及手工建模处理等
c)假三维数据(那种不能旋转的45度三维俯视图):依赖照片拍摄和材质帖纹手工制作。
d)街景:依赖实采拍摄
百度地图基本上只有最基本常有的一些图层数据,例如部分三维数据,交通图层数据,卫片图层数据等,百度不具备这部分数据的采集和生产能力,都是向不同供应商外购的。
高德地图有一些专用数据,例如楼盘数据等,高德在一些数据领域有采集和生产能力(例如三维数据等),可以根据客户的要求进行专业采集生产过程,提供专业的图层数据。
不过一些特别偏,特别专业的数据领域(就像上面有的有电视网,地址灾害图)就需要应用者自己通过专业的工具进行制作了
有很多特种数据图层是不能在瓦片图引擎上显示,或者在瓦片图引擎上显示是没有任何意义的。
只存在于矢量引擎的应用。
总结:
百度的地图数据主要靠买,高德地图数据以自己采集生产为主。
就国内的情况来看,主要的数据都依赖于采集。这点和国外发达国家有比较大的差别。在国外发达国家,由于建设速度相对比较缓慢,政府的信息化水平以及信息透明做得较好,其实不需要那么多采集工作。
这个行业内有句话,叫做国外(发达国家)以内勤为主,外勤为辅,国内以外勤为主,内勤为辅。
由于地物变化相对比较缓慢,政府公开和发布的数据比较及时,透明,准确,可用,因此国外这个行业许多数据生产商直接拿政府公布数据做一下加工就可以了,改动的地方也不多,国内还比较依赖数据生产上自己采集。
(举个例子,这里面比较典型极致的是日本,哪里新安装了一个红绿灯都会在政府网站上及时准确公布,并标注位置,更不用说楼盘建设,城市建设等大动作了,因此数据生产商拿这些数据来就可以直接用,很少需要自己去采集了)
以上就是关于apache poi获取ppt全部内容和细化读取的区别全部的内容,包括:apache poi获取ppt全部内容和细化读取的区别、高德地图 poi 搜索、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)