最近需要做一个将手机中保存的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表: