2011-07-04 2 views
0

netbeans 7.0でJavaを使用してExcel(XSLX)ファイルを読み込んでいます。 Excelシートの内容を読み込んで出力することもできます。Javaを使用してExcel(XSLX)からXMLをフレーム化する方法

これでExcelデータをXMLファイルに変換する必要がありました。タグは列ヘッダーになり、各行は対応するタグに入ります。

これはxslxファイルの入力ワークシートです。 ID、Variable、desc、notesは列見出しです。

ID   Variable  Desc  Notes 
B0001     VSI_C 
B0001   1  VSI_C_R  
B0001   2  VSI_C_P  
B0002     VSI_C_L  
B0003     VSI_C_H  
B0004     VSI_C_O  

今、私は、XMLファイルにこのデータを変換しています。 私は期待していた出力は、私がこれまで試した、

<?xml version="1.0" encoding="UTF-8"?> 
<Bin_code> 
<DCT> 
    <ID>B0001</ID> 
    <Variable/> 
    <Desc>VSI_C</Desc> 
    <Notes/> 
</DCT> 
<DCT> 
    <ID>B0001</ID> 
    <Variable/> 
    <Desc>VSI_C_R</Desc> 
    <Notes/> 
</DCT> 
    ............ 
    ............... 
</Bin_code> 

です。私は 'シート'オブジェクトを使用する必要があることを知っています。しかし、私はこれをどのように使用するかはわかりません。

import java.io.File;

import java.io.FileInputStream; 
import java.io.InputStream; 
import java.io.*; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel. Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 
import org.apache.poi.ss.usermodel.WorkbookFactory; 

public class XSLXReader { 
public static void main(String[] args) 
{ 
    DataInputStream in = null; 
    BufferedReader br = null; 
    FileWriter fostream; 
    FileWriter fostreamBatch; 
    BufferedWriter out = null; 
    BufferedWriter outBatch = null; 
    String strOutputPath = "D:\\Proj\\Current_\\"; 
    String strFilePrefix = "Master 5.2-B"; 
    String strLine; 

    try {   
    InputStream inputStream = new FileInputStream(new File("D:\\Proj\\Current_\\Master A-B.xlsx")); 
    Workbook wb = WorkbookFactory.create(inputStream);    
    Sheet sheet = wb.getSheet("Bin-code"); 

    in = new DataInputStream(inputStream); 
    br = new BufferedReader(new InputStreamReader(in)); 

    fostream = new FileWriter(strOutputPath+"\\"+strFilePrefix+".xml"); 
    out = new BufferedWriter(fostream); 

    out.write("<Bin-code>"); 

    while ((strLine = br.readLine()) != null) 
    { 
     out.write("<DCT>"); 
     out.write("<ID>" + strLine.substring(1, strLine.length()) + "</ID>"); 

     out.write("</DCT>"); 

    } 
    out.write("</Bin-code>"); 
} catch (Exception e) {   
    e.printStackTrace();   
} 
} 

}

上記のようにXMLにデータを出力するようにxslxで入力されたデータをフレーミングで私を助けてください。

おかげ RAMM

+0

。 – ThomasRS

答えて

5

あなたは、直接ファイルを読み取るためのInputStreamを使用しないでください。ワークブックを開いてシートにアクセスしたら、シート内のすべての行を繰り返し処理してから、行内のセルを反復処理できます。例はApache POIサイトhttp://poi.apache.org/spreadsheet/quick-guide.html#Iteratorです。そうすれば、あなたのXMLを手作業で印刷したり、多くのXMLライブラリとDTDのいずれかを使ってあなたのためにそれを行うことができます。

はここで働く完全なソースです:

import java.io.*; 
import org.apache.poi.ss.usermodel.*; 
import java.text.*; 

public class XSLXReader { 
    static DecimalFormat df = new DecimalFormat("#####0"); 

    public static void main(String[] args) { 
     FileWriter fostream; 
     PrintWriter out = null; 
     String strOutputPath = "D:\\Proj\\Current_\\"; 
     String strFilePrefix = "Master 5.2-B"; 

     try { 
      InputStream inputStream = new FileInputStream(new File("D:\\Proj\\Current_\\Master A-B.xlsx")); 
      Workbook wb = WorkbookFactory.create(inputStream); 
      Sheet sheet = wb.getSheet("Bin-code"); 

      fostream = new FileWriter(strOutputPath + "\\" + strFilePrefix+ ".xml"); 
      out = new PrintWriter(new BufferedWriter(fostream)); 

      out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
      out.println("<Bin-code>"); 

      boolean firstRow = true; 
      for (Row row : sheet) { 
       if (firstRow == true) { 
        firstRow = false; 
        continue; 
       } 
       out.println("\t<DCT>"); 
       out.println(formatElement("\t\t", "ID", formatCell(row.getCell(0)))); 
       out.println(formatElement("\t\t", "Variable", formatCell(row.getCell(1)))); 
       out.println(formatElement("\t\t", "Desc", formatCell(row.getCell(2)))); 
       out.println(formatElement("\t\t", "Notes", formatCell(row.getCell(3)))); 
       out.println("\t</DCT>"); 
      } 
      out.write("</Bin-code>"); 
      out.flush(); 
      out.close(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    private static String formatCell(Cell cell) 
    { 
     if (cell == null) { 
      return ""; 
     } 
     switch(cell.getCellType()) { 
      case Cell.CELL_TYPE_BLANK: 
       return ""; 
      case Cell.CELL_TYPE_BOOLEAN: 
       return Boolean.toString(cell.getBooleanCellValue()); 
      case Cell.CELL_TYPE_ERROR: 
       return "*error*"; 
      case Cell.CELL_TYPE_NUMERIC: 
       return XSLXReader.df.format(cell.getNumericCellValue()); 
      case Cell.CELL_TYPE_STRING: 
       return cell.getStringCellValue(); 
      default: 
       return "<unknown value>"; 
     } 
    } 

    private static String formatElement(String prefix, String tag, String value) { 
     StringBuilder sb = new StringBuilder(prefix); 
     sb.append("<"); 
     sb.append(tag); 
     if (value != null && value.length() > 0) { 
      sb.append(">"); 
      sb.append(value); 
      sb.append("</"); 
      sb.append(tag); 
      sb.append(">"); 
     } else { 
      sb.append("/>"); 
     } 
     return sb.toString(); 
    } 
} 

これが生成する出力:あなたはたとえばスタックスのようなものを使用して、適切なXMLライターに入力スイッチを得た後、

<?xml version="1.0" encoding="UTF-8"?> 
<Bin-code> 
    <DCT> 
     <ID>B0001</ID> 
     <Variable/> 
     <Desc>VSI_C</Desc> 
     <Notes/> 
    </DCT> 
    <DCT> 
     <ID>B0001</ID> 
     <Variable>1</Variable> 
     <Desc>VSI_C_R</Desc> 
     <Notes/> 
    </DCT> 
    <DCT> 
     <ID>B0001</ID> 
     <Variable>2</Variable> 
     <Desc>VSI_C_P</Desc> 
     <Notes/> 
    </DCT> 
    <DCT> 
     <ID>B0002</ID> 
     <Variable/> 
     <Desc>VSI_C_L</Desc> 
     <Notes/> 
    </DCT> 
    <DCT> 
     <ID>B0003</ID> 
     <Variable/> 
     <Desc>VSI_C_H</Desc> 
     <Notes/> 
    </DCT> 
    <DCT> 
     <ID>B0004</ID> 
     <Variable/> 
     <Desc>VSI_C_O</Desc> 
     <Notes/> 
    </DCT> 
</Bin-code> 
+0

こんにちはすべて、私は無駄にforループ内のコードを変更しようとしました。私はテーブルヘッダーを分割してタグとして使用することはできません。その中に値を印刷します。 – Ramm

+0

上記のIteratorの例の指示に従う必要があります。 inとbrのコードを削除し、forループでシートイテレータを使用するように変更します。次に、ループの内部で、行内のセルを反復処理します。 – g051051

関連する問題