我们公司是在ebay上卖东西的,每天都会有四五百条交易记录,ebay把这些交易记录导出成csv文件供用户下载。
下载这份文件之后,现在是用人力来处理这份文件,来整理出我们想要的报表,这当然是效率低,容易出错啦,一出错就是直接经济损失。(其中很大的部分是在处理乱码问题,由于文档里面可能出现多个欧洲国家的文字,所以很容易出现?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;
}

}

解决方案 »

  1.   

    快被老板逼疯了,救命啊!!我的QQ上班时间都在线,用msn的也可以加我的msn:[email protected]
      

  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
      

  3.   

    换下用POI来读取Excel试试,jxl对中文支持很好
    POI很强大给楼主推荐一个读取OpenOffice calc 文件的java库 
    Obba
    使用Obba,Spreadsheets可以很容易的从Excel迁入openOffice,反之亦然。主页:http://www.obba.info/ 
      

  4.   

     我现在不是出现中文乱码,而是读取其他一些西欧国家文字的时候,出现问号,我不知道是不是UTF-8编码也不够用,但是指定UTF-8编码用OpenOffice打开却没有问题
      

  5.   

    试一下GBK看能不能正常转过来!!!!
      

  6.   

      用GBK只会出现中文乱码,提示:读进程序的时候已经出现问号了
      

  7.   

    UTF-16LE  有些语言字符占3个字节。用UTF-8只取两个字符,当然不行。