最近由于在测试app性能问题,偶然发现服务器存放了两个版本的code码表,分别是xls和xlsx版本的,android端这边是解析的xls,ios那边则是解析的xlsx,为了统一,我查了很多资料然后解析xlsx;查了一下资料,这两者的区别,xls是office excel 03版本的,xlsx是office excel 07版本的。
网上有许多解析xlsx的开源库都可以借鉴的,大多分为三种解析方式,
一种是jxl,这种只能解析xls格式的,更新比较慢,但是库很小,因为是针对android使用的;
另一种是 poi,这种解析很方便,03版和07版excel都可以解析,但是库比较大,超过10M,poi最原始的想法不是给android调用的,里面包含了很多的解析,都是xlsx不需要的;
还有一种解析方式是,把xlsx格式的文件解压出来,然后去到解压目录xl文件夹里面,解析sharedStrings.xml文件即可,但是这种方式的缺点是只能解析很规范的数据,然后纯数字文本是解析不到的(也不知道为什么,亲测是拿不到纯数字文本的,有可能是因为纯数字是居中的,至于原因后续发现了更新博客);
我在项目里用的是第三种方式,也感谢网上的大哥提供的工具类啊,以此鸣谢;
import android.util.Xml;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
public class XLSXParse {
private String _armStr;
private OutFileType _outFileType;
private String _spiltStr;
private ArmFileType _armFileType;
public XLSXParse() {
}
public XLSXParse(Builder builder) {
this._armStr = builder._armStr;
this._outFileType = builder._outFileType;
this._spiltStr = builder._spiltStr;
this._armFileType =builder._armFileType;
}
// 定义最后输出的数据类型
public enum OutFileType{
FILE_TYPE_JSON,//json格式输出
FILE_TYPE_SPILT,//分隔符字符串输出
FILE_TYPE_LIST,//直接输出List类型数据
FILE_TYPE_ARRAY//输出字符串型二位数组
}
public enum ArmFileType{
XLS,
XLSX
}
public static class Builder {
private String _armStr = null;
private OutFileType _outFileType;
private String _spiltStr;
private ArmFileType _armFileType;
public Builder() {
this._spiltStr="|";
this._outFileType= OutFileType.FILE_TYPE_LIST;
}
public Builder(String armFilePath,String split,OutFileType fileType) {
this._armStr=armFilePath;
this._spiltStr=split;
this._outFileType=fileType;
}
//设置以什么格式输出