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表:

时间: 2024-11-03 05:23:07

Android导出Excel的相关文章

Java利用POI导入导出Excel中的数据

     首先谈一下今天发生的一件开心的事,本着一颗android的心我被分配到了PB组,身在曹营心在汉啊!好吧,今天要记录和分享的是Java利用POI导入导出Excel中的数据.下面POI包的下载地址http://poi.apache.org/download.html,有兴趣的朋友也可以去看看其中的API.      下面分享一下在对POI进行基本操作时觉得需要注意的两点:       1.POI中针对xlsx/xls是需要create different Workbook instance

通用导出excel(可控制内容)

实体类 package util; import java.sql.Timestamp; public class Book { private int bookId; private String name; private String author; private float price; private String isbn; private String pubName; private Timestamp date; public Book() { } public Book(i

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦

利用poi导出Excel

import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.sql.Date;import java.util.ArrayList;import java.util.List; import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.

goalng导出excel(csv格式)

最近项目中有个小需求,需要将查询结果导出到excel.之间前java比较容易,使用POI很容易就能实现,查了下golang的文档,发现golang下边并没有导出excel的包,但是却有一个encoding/csv的包,看了下发现可以导出csv文件,大家都知道csv文件其实就是文本格式的excel文件,可以直接通过excel打开或是导入excel. 看起来挺好的,问题如愿解决,但是事实证明对已一个还不成熟的语言或是库最好还是先测一下的好.兴冲冲的卸了测试例子,成功导出了一个text.csv文件,一

java 操作 Excel,java导出excel

WritableWorkbook out = null; try { response.getServletResponse().reset(); ((HttpServletResponse) response.getServletResponse()).setHeader("Content-Disposition", "attachment;filename=export.xls"); response.getServletResponse().setConten

导出excel 0kb的问题

运行导出代码,浏览器提示下载框,但是大小为0kb,跟踪代码执行情况,在这一行就结束了wb = new XSSFWorkbook( is );没有异常抛出.(可能是tomcat层面把异常处理了) 总之,找了半天问题,终于发现了,原来是jar包版本不一致造成的.看poi-ooxml-3.8的pom: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId>

C#.Net 导出Excel 之单元格 相关设置

range.NumberFormatLocal = "@";     //设置单元格格式为文本range = (Range)worksheet.get_Range("A1", "E1");     //获取Excel多个单元格区域:本例做为Excel表头range.Merge(0);     //单元格合并动作worksheet.Cells[1, 1] = "Excel单元格赋值";     //Excel单元格赋值range

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach