Android导出Excel

最近需要做一个将手机中保存的JSON文件转换成容易阅读的Excel文件,故做了一个小demo,现将该demo用到的一些部件记录一下。

1.文件浏览器

为了方便找到所需的JSON文件,故现做了一个简易的文件浏览器。

1.1文件列表

文件列表采用的是Android的空间ListView进行展示的,下面简要对ListView做一个简单的概述。

ListView的创建需要个元素:

1ListView中的每一列的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表:












  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风水月

从心底相信自己是成功的第一步

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值