您的位置:首页 > 移动开发 > Android开发

android 将SQLite数据库的表格导出为csv格式,并解析csv文件

2015-04-08 12:17 639 查看
在做android的开发的时候,将数据保存到SQLite数据库中,有时候会要将保存的这些数据导出成excel表格,这样更方便查看。通过查找资料,可以将数据库中的表格转化成

csv(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号)这种以纯文本的模式保存表格。还是以以前写的一个模板来实现点击打开链接,这里就不放这个的代码了,直接说将表格转化成csv格式导出。

isi.java

package com.example.project_isi;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class ISIActivity extends Activity{

private RelativeLayout rl;
private RelativeLayout rl2;
private int i = 0;
private String[] question = {"1、入睡困难:","2、维持睡眠困难:","3、早醒:","4、您对目前的睡眠模式满意/不满意程度如何?:",
"5、您认为您的失眠在多大程度上影响了您的日常功能:","6、您的失眠问题影响了您的生活质量,您觉得在别人眼中你的失眠程度如何?",
"7、您对目前的睡眠问题的担心/痛苦程度:","您的得分:"};
private Button resultbutton;
private int j;
private String buttontext;
private int resulttext[] = new int[10];
private RadioButton button01;
private RadioButton button02;
private RadioButton button03;
private RadioButton button04;
private RadioButton button05;
private RadioGroup radioGroup;
private TextView questiontext;
private int score;
private Button databutton;

@Override
protected void onCreate(Bundle savedInstanceState) {
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
super.onCreate(savedInstanceState);
setContentView(R.layout.isi);

questiontext = (TextView) findViewById(R.id.questiontitle);
radioGroup = (RadioGroup) findViewById(R.id.radiogroup);
button01 = (RadioButton) findViewById(R.id.button01);
button02 = (RadioButton) findViewById(R.id.button02);
button03 = (RadioButton) findViewById(R.id.button03);
button04 = (RadioButton) findViewById(R.id.button04);
button05 = (RadioButton) findViewById(R.id.button05);
databutton = (Button) findViewById(R.id.databutton);
rl = (RelativeLayout) findViewById(R.id.relativeLayout);
rl2 = (RelativeLayout) findViewById(R.id.relativeLayout2);
radioGroup.setOnCheckedChangeListener(new RadioGroupListener());
rl.setOnTouchListener(new OnTouchListener() {

@Override
public boolean onTouch(View arg0, MotionEvent arg1) {
rl.setVisibility(View.INVISIBLE);
rl2.setVisibility(View.VISIBLE);
return false;
}
});

databutton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent = new Intent();
intent.setClass(ISIActivity.this, PatientInfoManage.class);
startActivity(intent);
}
});

final Button nextbutton = (Button) findViewById(R.id.nextbutton);
nextbutton.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//questiontext.setText(question[i]);
//i ++;
if(button01.isChecked()==false && button02.isChecked()==false && button03.isChecked()==false
&& button04.isChecked()==false&& button05.isChecked()==false && i != 0){

new AlertDialog.Builder(ISIActivity.this)
.setTitle("温馨提示")
.setMessage("您还没有选择任何一个选项!")
.setPositiveButton("确定", null)
.show();
return;
}
else{
questiontext.setText(question[i]);
if(i < question.length +1){
i++;
}
if(i == 1){
radioGroup.setVisibility(View.VISIBLE);
}
//i++;
radioGroup.clearCheck();
}
score += j;
System.out.println("result----->" + score);
resulttext[i]= j;
System.out.println("选择的结果----》" + resulttext[i]);
//PInformation();
//question[7] = "您的得分: " + score;
if(i == question.length - 1){
nextbutton.setText("确定");
//score += j;
int total = score +j;
question[7] = "您的得分: " + total;
System.out.println("您的得分---" + total);
//PInformation();
//finish();
}

if(i == question.length ){
//finish();
PInformation();

radioGroup.setVisibility(View.INVISIBLE);
nextbutton.setVisibility(View.INVISIBLE);

}
}
});
}
public class RadioGroupListener implements OnCheckedChangeListener{

@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
if(checkedId == button01.getId()){
j = 0;
buttontext = button01.getText().toString();
System.out.println("buttontext ---" + buttontext);
}
if(checkedId == button02.getId()){
j = 1;
System.out.println("result11----->" + j);
buttontext = button02.getText().toString();
System.out.println("buttontext ---" + buttontext);
}
if(checkedId == button03.getId()){
j = 2;
buttontext = button03.getText().toString();
System.out.println("buttontext ---" + buttontext);
}
if(checkedId == button04.getId()){
j = 3;
buttontext = button04.getText().toString();
System.out.println("buttontext ---" + buttontext);
}
if(checkedId == button05.getId()){
j = 4;
buttontext = button05.getText().toString();
System.out.println("buttontext ---" + buttontext);
}
}

}
//获得要保存的数据
public void PInformation(){
int[] result = new int[8];
result[0] = resulttext[2];
result[1] = resulttext[3];
result[2] = resulttext[4];
result[3] = resulttext[5];
result[4] = resulttext[6];
result[5] = resulttext[7];
result[6] = resulttext[8];
result[7] = score;
String isi = "";
for(int i = 0;i < result.length;i++){
isi += String.valueOf(result[i]);
}
System.out.println("严重失眠指数----->" + isi);
PatientTest patientTest = new PatientTest();
patientTest.setIsi(isi);
PatientTestDAO ptdao = new PatientTestDAO(ISIActivity.this);
//获得最大的id
//PatientInformationDAO pd = new PatientInformationDAO(ISIActivity.this);
ptdao.insert(patientTest);
System.out.println("当前ID----" + ptdao.getMaxId());
Toast.makeText(ISIActivity.this, "【失眠程度评估】数据保存成功!", Toast.LENGTH_SHORT).show();
//
//String test_table = null;
Cursor c = ptdao.export();
ExportToCSV(c, "test_table.csv");
}
//导出表格的方法
public void ExportToCSV(Cursor c, String fileName) {

int rowCount = 0;
int colCount = 0;
FileWriter fw;
BufferedWriter bfw;
//获取sd卡根目录
File sdCardDir = Environment.getExternalStorageDirectory();
//保存文件目录
File saveFile = new File(sdCardDir, fileName);
try {

rowCount = c.getCount();
colCount = c.getColumnCount();
fw = new FileWriter(saveFile);
bfw = new BufferedWriter(fw);
if (rowCount > 0) {
c.moveToFirst();
// 写入表头
for (int i = 0; i < colCount; i++) {
if (i != colCount - 1)
bfw.write(c.getColumnName(i) + ',');
else
bfw.write(c.getColumnName(i));
}
// 写好表头后换行
bfw.newLine();
// 写入数据
for (int i = 0; i < rowCount; i++) {
c.moveToPosition(i);
// Toast.makeText(mContext, "正在导出第"+(i+1)+"条",
// Toast.LENGTH_SHORT).show();
Log.v("导出数据", "正在导出第" + (i + 1) + "条");
for (int j = 0; j < colCount; j++) {
if (j != colCount - 1)
bfw.write(c.getString(j) + ',');
else
bfw.write(c.getString(j));
}
// 写好每条记录后换行
bfw.newLine();
}
}
// 将缓存数据写入文件
bfw.flush();
// 释放缓存
bfw.close();
// Toast.makeText(mContext, "导出完毕!", Toast.LENGTH_SHORT).show();
Log.v("导出数据", "导出完毕!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
c.close();
}
}

}


上面有很多代码都是以前保存选项信息的代码,主要是最后一个方法实现格式的转化。

要在AndroidManifest.xml加上一句对文件的允许对sd卡可写

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

最后得到的文件名为test_table.csv,用excel打开得到的表格如下:



数据完整的转化成了excel表格了。

然后是解析csv文件,这个没有布局文件,

Mainactivity.java,由于csv文件是用“,”分开的,在程序中就可以利用“,”将其分割开。

package com.example.testlistview;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.StringTokenizer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class MainActivity extends Activity {

//获得根目录路径
File sdCardDir = Environment.getExternalStorageDirectory();
int i = 0;
int j = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

try {
File csv = new File(sdCardDir + "/test_table.csv"); // CSV文件
BufferedReader br = new BufferedReader(new FileReader(csv));
br.readLine();
// 读取直到最后一行
String line = "";
//这一行不为空
while ((line = br.readLine()) != null) {
i++;
//System.out.println("line---" + line);
// 把一行数据分割成多个字段
StringTokenizer st = new StringTokenizer(line, ",");
//遍历所有行,并打印出来,判断有没有分隔符
while (st.hasMoreTokens()) {
//j++;
// 每一行的多个字段用TAB隔开表示
//s[i] = st.nextToken();
System.out.print(st.nextToken());
// System.out.println("j ---" + j);
}
System.out.println();
//            	String item[] = line.split(",");//CSV格式文件为逗号分隔符文件,这里根据逗号切分
//
//                String last = item[item.length-1];//这就是你要的数据了
//                j = item.length;
//                System.out.println(last);
}
System.out.println("i----" + i);
System.out.println("j----" + j);
br.close();
} catch (Exception e) {
// 捕获File对象生成时的异常
e.printStackTrace();
}
}
}
最后打印出来的数据为




这样数据就完整的转换过来了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: