实践是知识的母亲,知识是生活的明灯。这篇文章主要讲述Android导出Excel相关的知识,希望能为你提供帮助。
最近需要做一个将手机中保存的JSON文件转换成容易阅读的Excel文件,
故做了一个小demo,
现将该demo用到的一些部件记录一下。
1.文件浏览器 为了方便找到所需的JSON文件,
故现做了一个简易的文件浏览器。
1.1文件列表
文件列表采用的是android的空间ListView进行展示的,
下面简要对ListView做一个简单的概述。
ListView的创建需要三个元素:
(
1)
ListView中的每一列的View。
(
2)
填入View的数据或者图片等。
(
3)
连接数据与ListView的适配器(
Adapter)
。
常用的ListView适配器有:
ArrayAdapter<
T>
、SimpleAdatper、SimpleCursorAdapter、BaseAdapter。ArrayAdapter最为简单,
ListView每一行只能展示一行字。SimpleAdapter有最好的扩充性,
可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,
可以方面的把数据库的内容以列表的形式展示出来。BaseAdapter是自定义适配器,
使用它必须自定义类继承它,
它可以实现更加多样的效果。
下面对ListView的使用做一个简单的描述:
(
1)
ListView资源视图的定义
<
ListView
android:id=
"
@
+
id/file_path_list"
android:layout_width=
"
match_parent"
android:layout_height=
"
wrap_content"
android:headerDividersEnabled=
"
true"
android:footerDividersEnabled=
"
true"
android:fastScrollEnabled=
"
true"
/>
( 2) ListView在Activity中创建
private ListView mListView =
null;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView =
(ListView)findViewById(R.id.file_path_list);
}
( 3) 各种Adapter的使用
( 3.1) ArrayAdatper< T> 使用
ArrayAdapter使用的资源视图 R.layout.simple_text.xml的定义
<
?xml version=
"
1.0"
encoding=
"
utf-8"
?>
<
LinearLayout
xmlns:android=
"
http://schemas.android.com/apk/res/android"
android:layout_width=
"
match_parent"
android:layout_height=
"
wrap_content"
android:paddingTop=
"
5dip"
android:paddingBottom=
"
5dip"
android:orientation=
"
horizontal"
android:gravity=
"
center_vertical"
>
<
TextView
android:id=
"
@
+
id/file_name"
android:layout_width=
"
wrap_content"
android:layout_height=
"
wrap_content"
android:singleLine=
"
true"
android:textAppearance=
"
?android:attr/textAppearanceMedium"
/>
<
/LinearLayout>
ArrayAdapter的使用
List<
String>
data =
new ArrayList<
String>
();
data.add("
数据1"
);
data.add("
数据2"
);
mListView.setAdapter(new ArrayAdapter<
String>
(this, android.R.layout.simple_item,getData()));
<
/span>
( 3.2) SimpleAdapter、SimpleCursorAdapter使用
SimpleAdatper、SimpleCursorAdapter的使用步骤与ArrayAdapter是一样的, 也是需要先定义好需要展示的View的xml, 然后创建该Adapter的时候讲该xml的资源ID带人, 同时填入数据, 下面简单列一下SimpleCursorAdapter读取通讯录用于View展示的代码。
//读取通讯录
Cursor cursor =
getContentResolver().query(People.CONTENT_URI, null, null, null, null);
startManagingCursor(cursor);
ListAdapter listAdapter =
new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor,new String[]{People.NAME}, new int[]{android.R.id.text1});
mListView.setAdapter(listAdapter);
( 3.3) BaseAdapter的使用
本次做的读取手机内存卡的文件浏览器采用的就是该适配器, 现将代码贴在此:
文件列表每一项样式定义的xml文件: file_browser_item.xml
<
?xml version=
"
1.0"
encoding=
"
utf-8"
?>
<
LinearLayout
xmlns:android=
"
http://schemas.android.com/apk/res/android"
android:layout_width=
"
match_parent"
android:layout_height=
"
wrap_content"
android:paddingTop=
"
5dip"
android:paddingBottom=
"
5dip"
android:orientation=
"
horizontal"
android:gravity=
"
center_vertical"
>
<
FrameLayout
android:layout_width=
"
wrap_content"
android:layout_height=
"
fill_parent"
android:layout_gravity=
"
center"
android:gravity=
"
center"
>
<
ImageView
android:id=
"
@
+
id/file_image_frame"
android:layout_width=
"
65px"
android:layout_height=
"
65px"
android:scaleType=
"
centerInside"
android:gravity=
"
center"
android:background=
"
@
drawable/image_icon_bg"
android:layout_gravity=
"
center"
android:visibility=
"
gone"
/>
<
ImageView
android:id=
"
@
+
id/file_image"
android:layout_width=
"
59px"
android:layout_height=
"
59px"
android:scaleType=
"
centerInside"
android:gravity=
"
center"
android:layout_gravity=
"
center"
/>
<
/FrameLayout>
<
LinearLayout
android:id=
"
@
+
id/file_info_layout"
android:layout_width=
"
0dip"
android:layout_height=
"
wrap_content"
android:layout_weight=
"
1"
android:layout_gravity=
"
center_vertical"
android:orientation=
"
vertical"
android:paddingLeft=
"
5dip"
>
<
LinearLayout
android:layout_width=
"
fill_parent"
android:layout_height=
"
wrap_content"
android:orientation=
"
horizontal"
>
<
TextView
android:id=
"
@
+
id/file_name"
android:layout_width=
"
wrap_content"
android:layout_height=
"
wrap_content"
android:singleLine=
"
true"
android:textAppearance=
"
?android:attr/textAppearanceMedium"
/>
<
TextView
android:id=
"
@
+
id/file_count"
android:layout_width=
"
wrap_content"
android:layout_marginLeft=
"
5dip"
android:layout_height=
"
wrap_content"
android:singleLine=
"
true"
android:textAppearance=
"
?android:attr/textAppearanceSmall"
/>
<
/LinearLayout>
<
LinearLayout
android:layout_width=
"
fill_parent"
android:layout_height=
"
wrap_content"
android:orientation=
"
horizontal"
>
<
TextView
android:id=
"
@
+
id/modified_time"
android:layout_width=
"
wrap_content"
android:layout_height=
"
wrap_content"
android:layout_gravity=
"
left"
android:gravity=
"
left"
android:textAppearance=
"
?android:attr/textAppearanceSmall"
/>
<
TextView
android:id=
"
@
+
id/file_size"
android:layout_width=
"
wrap_content"
android:layout_height=
"
wrap_content"
android:layout_gravity=
"
left"
android:layout_marginLeft=
"
14px"
android:gravity=
"
left"
android:textAppearance=
"
?android:attr/textAppearanceSmall"
/>
<
/LinearLayout>
<
/LinearLayout>
<
FrameLayout
android:id=
"
@
+
id/file_checkbox_area"
android:layout_width=
"
wrap_content"
android:layout_height=
"
fill_parent"
android:layout_gravity=
"
center"
android:gravity=
"
center"
android:paddingLeft=
"
10dip"
>
<
ImageView
android:id=
"
@
+
id/file_checkbox"
android:layout_width=
"
wrap_content"
android:layout_height=
"
wrap_content"
android:scaleType=
"
fitCenter"
android:gravity=
"
center"
android:layout_gravity=
"
center"
/>
<
/FrameLayout>
<
/LinearLayout>
继承自BaseAdapter的类定义:
package com.szx.exportexcel;
import java.io.File;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import com.szx.util.Constant;
import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
public class FileListAdapter extends BaseAdapter{
private Context mcontext =
null;
private List<
File>
mfiles =
null;
public FileListAdapter(Context context,List<
File>
files){
mcontext =
context;
mfiles =
files;
}
@
Override
public int getCount() {
int count =
0;
if(mfiles!=
null){
count =
mfiles.size();
}
return count;
} @
Override
public Object getItem(int position) {
if((position >
=
0) &
&
(position <
this.getCount()))
return mfiles.get(position);
return null;
} @
Override
public long getItemId(int position) {return position;
} @
Override
public View getView(int position, View convertView, ViewGroup parent) {
ListHolder mListHolder =
null;
if(convertView=
=
null){
convertView=
LayoutInflater.from(mcontext).inflate(R.layout.file_browser_item, parent,false);
mListHolder =
new ListHolder();
mListHolder.mfileIcon =
(ImageView)convertView.findViewById(R.id.file_image);
mListHolder.mfileName =
(TextView)convertView.findViewById(R.id.file_name);
mListHolder.mfileSize =
(TextView)convertView.findViewById(R.id.file_size);
mListHolder.mfileTime =
(TextView)convertView.findViewById(R.id.modified_time);
convertView.setTag(mListHolder);
}else{
mListHolder =
(ListHolder)convertView.getTag();
}File f =
(File)this.getItem(position);
if(f!=
null){
String fileIcon =
Constant.getFileIcon(f);
if(fileIcon =
=
null){
Drawable drawable =
this.getApkIcon(f.getAbsolutePath());
if(drawable!=
null){
mListHolder.mfileIcon.setImageDrawable(drawable);
}else{
mListHolder.mfileIcon.setImageResource(R.drawable.file_icon_default);
}}else{
Resources res =
mcontext.getResources();
int icon =
res.getIdentifier(fileIcon, "
drawable"
, mcontext.getPackageName());
if(icon<
=
0){
icon =
R.drawable.file_icon_default;
}
mListHolder.mfileIcon.setImageResource(icon);
}if(f.isFile()){
mListHolder.mfileName.setText(f.getName());
mListHolder.mfileSize.setText(this.getFileSize(f.length()));
}else{
File[] files =
f.listFiles();
mListHolder.mfileSize.setText("
"
);
if(files!=
null){
mListHolder.mfileName.setText(f.getName()+
"
("
+
files.length+
"
)"
);
}else{
mListHolder.mfileName.setText(f.getName());
}}
mListHolder.mfileTime.setText(this.getFileTime(f.lastModified()));
}
return convertView;
}
public String getFileTime(long filetime) {
SimpleDateFormat formatter =
new SimpleDateFormat ("
yyyy-MM-dd hh:mm:ss"
);
String ftime =
formatter.format(new Date(filetime));
return ftime;
}
public Drawable getApkIcon(String path){
PackageManager pm =
mcontext.getPackageManager();
PackageInfo info =
pm.getPackageArchiveInfo(path, PackageManager.GET_ACTIVITIES);
if(info !=
null){
ApplicationInfo appInfo =
info.applicationInfo;
if(Build.VERSION.SDK_INT >
=
8){
appInfo.sourceDir =
path;
appInfo.publicSourceDir =
path;
}return appInfo.loadIcon(pm);
}
return null;
}
public String getFileSize(long filesize) {
DecimalFormat df =
new DecimalFormat("
#.00"
);
StringBuffer mstrbuf =
new StringBuffer();
if (filesize <
1024) {
mstrbuf.append(filesize);
mstrbuf.append("
B"
);
} else if (filesize <
1048576) {
mstrbuf.append(df.format((double)filesize / 1024));
mstrbuf.append("
K"
);
} else if (filesize <
1073741824) {
mstrbuf.append(df.format((double)filesize / 1048576));
mstrbuf.append("
M"
);
} else {
mstrbuf.append(df.format((double)filesize / 1073741824));
mstrbuf.append("
G"
);
}df =
null;
return mstrbuf.toString();
}
static class ListHolder{
ImageView mfileIcon;
TextView mfileName;
TextView mfileSize;
TextView mfileTime;
}
}
自定义FileListAdapter的使用:
mFileListAdapter =
new FileListAdapter(this,mFileList);
mListView.setAdapter(mFileListAdapter);
mFileListAdapter.notifyDataSetChanged();
继承自BaseAdapter的类必须实现如下几个函数:
@
Override
public int getCount() {
// TODO Auto-generated method stub
return 0;
}@
Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}@
Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}@
Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
return null;
}
其中getCount返回Adapter中有几条数据, getItem返回列表中位置为position的那一项, getView实现了整个列表中每一条样式的展现。
本demo的文件列表展示效果如下:
文章图片
1.2ListView长按菜单的实现
ListView中长按菜单的实现由两种方式, 一种是实现setOnItemLongClickListener事件, 另外一种是通过上下文菜单实现。
( 1) 使用setOnItemLongClickListener实现
使用该方式实现需要自己实现弹出框的代码, 本demo中采用上下文菜单方式实现。
mListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @
Override
public boolean onItemLongClick(AdapterView<
?>
parent, View v,
int pos, long id) {return false;
}
});
( 2) 通过上下文菜单实现
( 2.1) 在OnCreate函数中给ListView注册上下文
registerForContextMenu(mListView);
( 2.2) Activity实现onCreateContextMenu、onContextItemSelected两个方法
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater =
getMenuInflater();
inflater.inflate(R.menu.context_filemenu, menu);
AdapterView.AdapterContextMenuInfo info =
null;
try {
info =
(AdapterView.AdapterContextMenuInfo) menuInfo;
} catch (ClassCastException e) {
return;
} File mselectedFile =
(File)mFileListAdapter.getItem(info.position);
if(mselectedFile !=
null)
{
menu.setHeaderTitle(mselectedFile.getName());
}
}
public boolean onContextItemSelected(MenuItem item) {
AdapterContextMenuInfo info =
(AdapterContextMenuInfo)item.getMenuInfo();
File f =
(File)mFileListAdapter.getItem(info.position);
if(f =
=
null)
return false;
switch(item.getItemId()){
case R.id.exportExcel:return true;
default:
return super.onContextItemSelected(item);
}
}
1.3SD卡路径文件的获取
( 1) SD卡路径的获取
File f =
null;
boolean sdCardExist =
Environment.getExternalStorageState()
.equals(Environment.MEDIA_MOUNTED);
//判断sd卡是否存在
if(sdCardExist)
{
f =
Environment.getExternalStorageDirectory();
//获取sd卡目录
if (f !=
null) {
mSDCardPath =
f.getAbsolutePath();
} f =
Environment.getRootDirectory();
//获取根目录
if (f !=
null) {
mRootPath =
f.getAbsolutePath();
}
}
( 2) SD卡文件的获取及展示
File file =
null;
if(mCurrentPathFile!=
null){
if(mCurrentPathFile.isDirectory()){
file =
mCurrentPathFile;
}else{
file =
mCurrentPathFile.getParentFile();
}
}else{
file =
new File(mSDCardPath);
}
if(file!=
null){
if(file.exists()&
&
file.canRead()){
if(file.isFile()){}else{
mFileList.clear();
mFileListAdapter.notifyDataSetChanged();
mCurrentPathFile =
file;
mCurrentPathView.setText(mCurrentPathFile.getAbsolutePath());
File[] files =
file.listFiles();
Arrays.sort(files,new FileComparator());
for(File f:files){
mFileList.add(f);
mFileListAdapter.notifyDataSetChanged();
}
}
}
}
2.JSON字符串转换成HashMap JSON解析的库有三种: Android自带的JSON解析库, net.sf.json库, gson库。其中Android自带的JSON库使用起来不方便, net.sf.json库使用的Jar包与Android的包冲突, 故Android中普遍使用gson来进行JSON的解析。
下面是从网上摘录的使用gson转换JSON串为Map的工具类
package com.szx.util;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
/**
* 使用Gson把json字符串转成Map
*/
public class JSONUtil {
/**
* 获取JsonObject
* @
param json
* @
return
*/
public static JsonObject parseJson(String json){
JsonParser parser =
new JsonParser();
JsonObject jsonObj =
parser.parse(json).getAsJsonObject();
return jsonObj;
}
/**
* 根据json字符串返回Map对象
* @
param json
* @
return
*/
public static Map<
String,Object>
toMap(String json){
return JSONUtil.toMap(JSONUtil.parseJson(json));
}
/**
* 将JSONObjec对象转换成Map-List集合
* @
param json
* @
return
*/
public static Map<
String, Object>
toMap(JsonObject json){
Map<
String, Object>
map =
new HashMap<
String, Object>
();
Set<
Entry<
String, JsonElement>
>
entrySet =
json.entrySet();
for (Iterator<
Entry<
String, JsonElement>
>
iter =
entrySet.iterator();
iter.hasNext();
){
Entry<
String, JsonElement>
entry =
iter.next();
String key =
entry.getKey();
Object value =
entry.getValue();
if(value instanceof JsonArray)
map.put((String) key, toList((JsonArray) value));
else if(value instanceof JsonObject)
map.put((String) key, toMap((JsonObject) value));
else
map.put((String) key, value);
}
return map;
}
/**
* 将JSONArray对象转换成List集合
* @
param json
* @
return
*/
public static List<
Object>
toList(JsonArray json){
List<
Object>
list =
new ArrayList<
Object>
();
for (int i=
0;
i<
json.size();
i+
+
){
Object value =
json.get(i);
if(value instanceof JsonArray){
list.add(toList((JsonArray) value));
}
else if(value instanceof JsonObject){
list.add(toMap((JsonObject) value));
}
else{
list.add(value);
}
}
return list;
}}
虽然net.sf.json与Android冲突, 但是使用它转JSON串的工具类在其他地方用处也很大, 故也记录与此。
net.sf.json使用的jar文件如图:
文章图片
工具类如下:
package com.szx.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONObject;
import android.content.Context;
public class JSONUtil { public static String getRaw(Context context, int RawId) {try {
InputStream is =
context.getResources().openRawResource(RawId);
BufferedReader reader =
new BufferedReader(
new InputStreamReader(is));
// StringBuffer线程安全;
StringBuilder线程不安全
StringBuffer sb =
new StringBuffer();
for (String str =
null;
(str =
reader.readLine()) !=
null;
) {
sb.append(str);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
} public static String getAsset(Context context, String fileName) {try {
InputStream is =
context.getResources().getAssets().open(fileName);
// StringBuffer线程安全;
StringBuilder线程不安全
BufferedReader reader =
new BufferedReader(
new InputStreamReader(is));
StringBuffer sb =
new StringBuffer();
for (String str =
null;
(str =
reader.readLine()) !=
null;
) {
sb.append(str);
}
return sb.toString();
} catch (IOException e) {
e.printStackTrace();
}return null;
} public static void JsonObject2HashMap(JSONObject jo, List<
Map<
?, ?>
>
rstList) {
for (Iterator<
String>
keys =
jo.keys();
keys.hasNext();
) {
try {
String key1 =
keys.next();
System.out.println("
key1---"
+
key1 +
"
------"
+
jo.get(key1)
+
(jo.get(key1) instanceof JSONObject) +
jo.get(key1)
+
(jo.get(key1) instanceof JSONArray));
if (jo.get(key1) instanceof JSONObject) {JsonObject2HashMap((JSONObject) jo.get(key1), rstList);
continue;
}
if (jo.get(key1) instanceof JSONArray) {
JsonArray2HashMap((JSONArray) jo.get(key1), rstList);
continue;
}
System.out.println("
key1:"
+
key1 +
"
----------jo.get(key1):"
+
jo.get(key1));
json2HashMap(key1, jo.get(key1), rstList);
} catch (Exception e) {
e.printStackTrace();
}} }
public static void JsonArray2HashMap(JSONArray joArr,
List<
Map<
?, ?>
>
rstList) {
for (int i =
0;
i <
joArr.size();
i+
+
) {
try {
if (joArr.get(i) instanceof JSONObject) {JsonObject2HashMap((JSONObject) joArr.get(i), rstList);
continue;
}
if (joArr.get(i) instanceof JSONArray) {JsonArray2HashMap((JSONArray) joArr.get(i), rstList);
continue;
}
System.out.println("
Excepton~~~~~"
);
} catch (Exception e) {
e.printStackTrace();
}} } public static void json2HashMap(String key, Object value,
List<
Map<
?, ?>
>
rstList) {
HashMap<
String, Object>
map =
new HashMap<
String, Object>
();
map.put(key, value);
rstList.add(map);
}
/**
* @
param jsonData
* @
param rstList
* @
param params
* @
func hashmap追加字段
*/
public static void JsonToHashMap(JSONObject jsonData, Map<
String, Object>
rstList,
String... params) {
try {
for (Iterator<
String>
keyStr =
jsonData.keys();
keyStr.hasNext();
) {String key1 =
keyStr.next().trim();
if (jsonData.get(key1) instanceof JSONObject) {
HashMap<
String, Object>
mapObj =
new HashMap<
String, Object>
();
JsonToHashMap((JSONObject) jsonData.get(key1), mapObj, params);
rstList.put(key1, mapObj);
continue;
}
if (jsonData.get(key1) instanceof JSONArray) {
ArrayList<
Map<
String, Object>
>
arrayList =
new ArrayList<
Map<
String, Object>
>
();
JsonToHashMap((JSONArray) jsonData.get(key1), arrayList, params);
rstList.put(key1, arrayList);
continue;
}
JsonToHashMap(key1, jsonData.get(key1), rstList);
}
// 追加字段
if (params !=
null &
&
params.length =
=
2) {
rstList.put(params[0], params[1]);
}
if (params !=
null &
&
params.length =
=
4) {
rstList.put(params[0], params[1]);
rstList.put(params[2], params[3]);
}} catch (Exception e) {
e.printStackTrace();
} } public static void JsonToHashMap(JSONArray jsonarray, List<
Map<
String, Object>
>
rstList,
String... params) {
try {
for (int i =
0;
i <
jsonarray.size();
i+
+
) {
if (jsonarray.get(i) instanceof JSONObject) {HashMap<
String, Object>
mapObj =
new HashMap<
String, Object>
();
JsonToHashMap((JSONObject) jsonarray.get(i), mapObj, params);
rstList.add(mapObj);
continue;
}
}} catch (Exception e) {
e.printStackTrace();
} } public static void JsonToHashMap(String key, Object value, Map<
String, Object>
rstList) {
key =
replaceBlank(key);
if (value instanceof String) {
rstList.put(key, replaceBlank((String) value));
return;
}
rstList.put(key, value);
}
public static String replaceBlank(String str) {
String dest =
"
"
;
if (str !=
null) {
Pattern p =
Pattern.compile("
\\\\s*|t|r|n"
);
Matcher m =
p.matcher(str);
dest =
m.replaceAll("
"
);
}
return dest;
}
}
3.导出Excel Android中导出excel使用的类库是jxl, 下面是使用jxl.jar实现的导出excel的类
package com.szx.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
import jxl.write.Label;
import jxl.write.WritableCell;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
public class ExcelUtils {
public static WritableFont arial14font =
null;
public static WritableCellFormat arial14format =
null;
public static WritableFont arial10font =
null;
public static WritableCellFormat arial10format =
null;
public static WritableFont arial12font =
null;
public static WritableCellFormat arial12format =
null;
public final static String UTF8_ENCODING =
"
UTF-8"
;
public final static String GBK_ENCODING =
"
GBK"
;
public static void format() {
try {
arial14font =
new WritableFont(WritableFont.ARIAL, 14,
WritableFont.BOLD);
arial14font.setColour(jxl.format.Colour.LIGHT_BLUE);
arial14format =
new WritableCellFormat(arial14font);
arial14format.setAlignment(jxl.format.Alignment.CENTRE);
arial14format.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
arial14format.setBorder(jxl.format.Border.ALL,
jxl.format.BorderLineStyle.THIN);
arial14format.setBackground(jxl.format.Colour.VERY_LIGHT_YELLOW);
arial10font =
new WritableFont(WritableFont.ARIAL, 10,
WritableFont.BOLD);
arial10format =
new WritableCellFormat(arial10font);
arial10format.setAlignment(jxl.format.Alignment.CENTRE);
arial10format.setBorder(jxl.format.Border.ALL,
jxl.format.BorderLineStyle.THIN);
arial10format.setBackground(jxl.format.Colour.LIGHT_BLUE);
arial12font =
new WritableFont(WritableFont.ARIAL, 12);
arial12format =
new WritableCellFormat(arial12font);
arial12format.setBorder(jxl.format.Border.ALL,
jxl.format.BorderLineStyle.THIN);
} catch (WriteException e) {e.printStackTrace();
}
}
public static void createSmtrautExcel(String fileName,String sheetName,String[] lineName,String[] colName,List<
List<
Map<
String,Object>
>
>
values){
format();
WritableWorkbook workbook =
null;
try {
File file =
new File(fileName);
if (!file.exists()) {
file.createNewFile();
}
boolean isWrite =
file.canWrite();
workbook =
Workbook.createWorkbook(file);
WritableSheet sheet =
workbook.createSheet(sheetName, 0);
int ran =
1;
for(int j=
0;
j<
values.size();
j+
+
){
sheet.setRowView(j*6+
ran-1, 600);
for (int line =
0;
line <
lineName.length;
line+
+
) {
sheet.addCell(new Label(line+
1, j*6+
ran, lineName[line], arial10format));
}
for (int col =
0;
col <
colName.length;
col+
+
) {
sheet.addCell(new Label(0, col+
j*6+
ran+
1, colName[col], arial10format));
}for(int i=
0;
i<
values.get(j).size();
i+
+
){
Map<
String,Object>
m =
values.get(j).get(i);
int col =
(Integer) m.get("
col"
);
int line =
(Integer)m.get("
line"
);
String value =
(String)m.get("
value"
);
if(col=
=
0&
&
line=
=
0){
sheet.addCell(new Label(col,line+
j*6+
ran-1, value, arial14format));
sheet.addCell(new Label(col,line+
j*6+
ran, "
"
, arial10format));
sheet.mergeCells(col, line+
j*6+
ran-1, col+
lineName.length, line+
j*6+
ran-1);
}else{
sheet.addCell(new Label(col,line+
j*6+
ran, value, arial10format));
}
}
ran+
+
;
}
workbook.write();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (workbook !=
null) {
try {
workbook.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
使用jxl进行导出excel导出文件, 简单说几点:
( 1) 创建excel: WritableWorkbook workbook = Workbook.createWorkbook(file);
( 2) 创建sheet: WritableSheet sheet = workbook.createSheet(sheetName, 0);
( 3) 写入单元格数据: sheet.addCell(new Label(col,line+ j*6+ ran, value, arial10format)); 其中Label中第一个参数是列, 第二个参数是行, 第三个参数是写入单元格中的值, 第四个参数是单元格的样式
( 4) 设置行高: sheet.setRowView(j*6+ ran-1, 600); 其中第一个参数是行号, 第二个参数是行高
( 5) 合并单元格: sheet.mergeCells(col, line+ j*6+ ran-1, col+ lineName.length, line+ j*6+ ran-1); 其中第一个参数是合并单元格左上角的列号, 第二个参数是左上角的行号, 第三个参数是右下角的列号, 第四个参数是右下角的行号。
上述即是该demo中使用的技术点, 该demo可从该处下载。
该demo实现了如下JSON串:
{"
acc_ffz"
:1.6,"
acc_fz"
:0.8,"
acc_yxz"
:0.6,"
bulk_mathValue"
:-1.0,"
dis_ffz"
:10.8,"
dis_fz"
:5.4,"
dis_yxz"
:3.8,"
en_ffz"
:1.4,"
en_fz"
:0.7,"
en_yxz"
:0.5,"
sample_time"
:"
2016-09-09T03:15:25.313+
0000"
,"
signalType"
:-1,"
tmp"
:41.2,"
vel_ffz"
:1.1,"
vel_fz"
:0.6,"
vel_yxz"
:0.4}
转换成该改格式的excel表:
文章图片
【Android导出Excel】
推荐阅读
- Android 导入jar包 so模块--导入放置的目录
- Android N 新特性
- Xamarin.Android splash页面瞬间响应_避免APP启动闪白屏
- Android线程之间的通讯
- Android5.0开发范例大全 读书笔记
- JAVA安卓植物大战僵尸主题四子棋游戏
- Android软件开发之SharedPreferences
- Android中数据的传递
- android应用内存占用测试(每隔一秒打印procrank的信息)