下载这份文件之后,现在是用人力来处理这份文件,来整理出我们想要的报表,这当然是效率低,容易出错啦,一出错就是直接经济损失。( 其中很大的部分是在处理乱码问题,由于文档里面可能出现多个欧洲国家的文字,所以很容易出现?HUO或乱码)
如果直接用 office excel打开csv文件,里面出现?及乱码,比如德文,但如果用OpenOffice calc 选择utf-8打开则正常显示
公司的意思是要我用系统来处理这份文档,生成 excel报表
我最初的想法是先把csv文件先转化为excel文件,然后把这个excel文件上传到系统里面去,然后系统用jxl读取excel文件的内容,然后结合数据库通过excel模板输出excel报表。
1, csv转换成excel:用OpenOffice Calc(3.1)打开,打开的时候要选择编码方式,我用的是
utf-8,打开后没有乱码,然后另存为97的excel模板文件(*.xls),然后再用office excel打开,内容显示正常。
2, 问题出现了,把文件上传到系统里面,然后jxl读取excel的内容到程序里面出现乱码和问号,后来通过在网上找资料, 在程序里指定了utf-8方式读取文件,乱码没有了,但是还有问号出现。换了其他编码方式还是不行,比如gb2312,us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-9,ISO-8859-15.
很郁闷啊,用office 打开这个excel文件内容正常,但是一旦用程序读取之后就出现[color=#FF0000]问号了,
望大虾赐教啊!!!
两个文件的地址
http://112.91.144.170:8888/csv.csv (用迅雷或者其他工具先下载下来再打开)
http://112.91.144.170:8888/excel.xls
[/color]
读取excel文档代码如下(只打印输出在控制台上):
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import jxl.Cell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.WorkbookSettings;
private static Workbook getWorkbook(String filePath){
try {
// 构建Workbook对象, 只读Workbook对象
// 直接从本地文件创建Workbook
// 从输入流创建Workbook
// 创建只读的Excel工作薄的对象
WorkbookSettings workbookSettings=new WorkbookSettings();
workbookSettings.setEncoding("utf-8"); //关键代码,解决中文乱码 但英文就?
// workbookSettings.setEncoding("gb2312");
// workbookSettings.setEncoding("us-ascii");
// workbookSettings.setEncoding("iso-8859-1");
// workbookSettings.setEncoding("iso-8859-2");
// workbookSettings.setEncoding("iso-8859-9");
// workbookSettings.setEncoding("iso-8859-15");
InputStream is = new FileInputStream(filePath);
// Workbook wb=Workbook.getWorkbook(is, workbookSettings);
return Workbook.getWorkbook(is,workbookSettings);
} catch (Exception e) {
System.out.println("----------------Exception Occured,when read Excel file.");
return null;
}
}
@SuppressWarnings("unchecked")
public static List readExcel(String filePath) {
List datas = null;
rwb=getWorkbook(filePath);
Sheet rs = rwb.getSheet(0);
Cell[] cells = rs.getColumn(15);
datas = new ArrayList();
for (int i = 0;i< cells.length;i++) {
Cell[] cells2=rs.getRow(i);
if (i == 0) {
Map title=wrap(cells2);
title.put(42, "HK$");
title.put(43, "Account");
datas.add(title);
continue;
}
if (filterData(rs.getRow(i))) {
datas.add(wrap(rs.getRow(i)));//数据处理
}
}
rwb.close();
return datas;
}
//包装数据
@SuppressWarnings("unchecked")
private static Map wrap(Cell[] row ){
Map o=new LinkedHashMap();
for(int i=0;i<columnNum;i++){
String c=null;
if(i+1>row.length){
c="";
}else{
c=row[i].getContents();
}
if(i==14&&c!=null&&!c.equals("")){ //第15列显示邮寄地址
System.out.println(c);
}
if(i==38){//第39列显示国家
System.out.println(c);
}
o.put(i,c);
}
return o;
}
更尴尬的事发生了,在几乎网上推荐的编码方式都试过了之后,我转变思维,直接用程序指定utf-8方式读取 csv文档,程序里面还是有 问号出现,但是如果用前面提到的OpenOffice calc 指定utf-8打开却没有问题。用UltraEdit打开也没问题。
后来我试了另外两个读取csv的jar包(opencsv-2.0.jar,javacsv.jar),结果还是一样
令我疑惑的是,连utf-8也解释不了的字符,其他编辑软件是怎么处理的,至于程序出现的问号,问题到底出现在哪里?
想要jar包的加我 QQ363292613
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import com.csvreader.CsvReader;
import au.com.bytecode.opencsv.CSVReader;
public class testFile {
public static void main(String[] args) throws Exception {
// testFile.importCsvFile();
testFile.csv2();
// testFile.CSVReaderDemo();
}
private static String filePath = "F:\\26112009-original.csv";
@SuppressWarnings("unchecked")
public static void CSVReaderDemo(){
try {
CsvReader reader = new CsvReader(filePath,',',Charset.forName("UTF-8"));
reader.readHeaders();
String[] headers = reader.getHeaders();
//int headerCount = reader.getHeaderCount();
//int col = reader.getColumnCount();
List list = new ArrayList();
while(reader.readRecord()){
String[] str=reader.getValues();
System.out.println(Arrays.deepToString(str));
// list.add(reader.getValues());
}
Iterator it=list.iterator();
} catch (Exception ex){
ex.printStackTrace();
}
}
public static void csv2() throws Exception{
DataInputStream in = new DataInputStream(new FileInputStream(new File("F:\\26112009-original.csv")));
//讀csv file
String fileType;
fileType="utf-8";
// fileType="gb2312";
// fileType="us-ascii";
// fileType="iso-8859-1";
// fileType="iso-8859-2";
// fileType="iso-8859-9";
// fileType="iso-8859-15";
String responseLine;
BufferedReader bf;
bf = new BufferedReader(new InputStreamReader(in,fileType));
//讀data using BufferedReader fileType 是csv file's format if file is Big5 fileType="Big5" etc...
while ((responseLine = bf.readLine()) != null){
// System.out.println(responseLine);
String str[]=responseLine.split(",");
// System.out.println(str.length);
// for(int i=0;i<str.length;i++){
// System.out.print(str[i]+" ");
//
// }
System.out.print(str[3]+" ");
System.out.print(str[str.length-3]+" ");
System.out.println();
// System.out.println(str[3]);
// System.out.println(str[38]);
}
}
public static void importCsvFile() {
CSVReader csvReader = null;
try {
DataInputStream in = new DataInputStream(new FileInputStream(new File("F:\\26112009-original.csv")));
// csvReader = new CSVReader(new FileReader("F:\\Program\\Tomcat5.5\\webapps\\QSF\\excel\\1260416476676.csv"),',');//importFile为要导入的文本格式逗号分隔的csv文件,提供getXX/setXX方法
csvReader = new CSVReader(new InputStreamReader(in,"utf-8"),',');
if(csvReader != null){
//first row is title, so past
csvReader.readNext();
String[] csvRow = null;//row
while ((csvRow = csvReader.readNext()) != null){
for (int i =0; i<csvRow.length; i++){
String temp = csvRow[i];
if(i==14){
System.out.println(initString(temp));
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public static String initString(String str) {
try {
return new String(str.getBytes("UTF-8"),"UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
11 个解决方案
#1
快被老板逼疯了,救命啊!!我的QQ上班时间都在线,用msn的也可以加我的msn:zepeng06630925@163.com
#2
程序用到的jar包也上传了
http://112.91.144.170:8888/opencsv-2.0.jar
http://112.91.144.170:8888/javacsv.jar
http://112.91.144.170:8888/jxl.jar
http://112.91.144.170:8888/opencsv-2.0.jar
http://112.91.144.170:8888/javacsv.jar
http://112.91.144.170:8888/jxl.jar
#3
换下用POI来读取Excel试试,jxl对中文支持很好
POI很强大
给楼主推荐一个读取OpenOffice calc 文件的java库
Obba
使用Obba,Spreadsheets可以很容易的从Excel迁入openOffice,反之亦然。
主页:http://www.obba.info/
POI很强大
给楼主推荐一个读取OpenOffice calc 文件的java库
Obba
使用Obba,Spreadsheets可以很容易的从Excel迁入openOffice,反之亦然。
主页:http://www.obba.info/
#4
mark
#5
我现在不是出现中文乱码,而是读取其他一些西欧国家文字的时候,出现问号,我不知道是不是UTF-8编码也不够用,但是指定UTF-8编码用OpenOffice打开却没有问题
#6
试一下GBK看能不能正常转过来!!!!
#7
如果使用过滤器还不行,介意LZ采用国际化格式标签
#8
用GBK只会出现中文乱码,提示:读进程序的时候已经出现问号了
#9
跟过滤器没有关系,我是把文件上传到服务器上,再由程序在本地读取文件的。
#10
怀疑跟系统的语言支持有关系
#11
UTF-16LE 有些语言字符占3个字节。用UTF-8只取两个字符,当然不行。
#1
快被老板逼疯了,救命啊!!我的QQ上班时间都在线,用msn的也可以加我的msn:zepeng06630925@163.com
#2
程序用到的jar包也上传了
http://112.91.144.170:8888/opencsv-2.0.jar
http://112.91.144.170:8888/javacsv.jar
http://112.91.144.170:8888/jxl.jar
http://112.91.144.170:8888/opencsv-2.0.jar
http://112.91.144.170:8888/javacsv.jar
http://112.91.144.170:8888/jxl.jar
#3
换下用POI来读取Excel试试,jxl对中文支持很好
POI很强大
给楼主推荐一个读取OpenOffice calc 文件的java库
Obba
使用Obba,Spreadsheets可以很容易的从Excel迁入openOffice,反之亦然。
主页:http://www.obba.info/
POI很强大
给楼主推荐一个读取OpenOffice calc 文件的java库
Obba
使用Obba,Spreadsheets可以很容易的从Excel迁入openOffice,反之亦然。
主页:http://www.obba.info/
#4
mark
#5
我现在不是出现中文乱码,而是读取其他一些西欧国家文字的时候,出现问号,我不知道是不是UTF-8编码也不够用,但是指定UTF-8编码用OpenOffice打开却没有问题
#6
试一下GBK看能不能正常转过来!!!!
#7
如果使用过滤器还不行,介意LZ采用国际化格式标签
#8
用GBK只会出现中文乱码,提示:读进程序的时候已经出现问号了
#9
跟过滤器没有关系,我是把文件上传到服务器上,再由程序在本地读取文件的。
#10
怀疑跟系统的语言支持有关系
#11
UTF-16LE 有些语言字符占3个字节。用UTF-8只取两个字符,当然不行。