0

含まれている最新バージョンのJavaComBridge(jacob-1.16)のExcelの例を見て、まったく新しいExcelファイルを作成して処理するため、少しがっかりしました。

私がやりたいのは、Javaから既存のExcelファイル(この場合は「JACOBWithExcel.xls」という名前)にアクセスすることですが、どのExcelファイルでも問題ありません。

ExcelのSourceForgeの例は私のマシンで正常に機能し、既存のExcelファイルにアクセスするために変更すると、次の問題が発生しました。

1.、ブックを取得したのと同じ方法で試したのに、ブックに既存のシートを取得できませんでした。

Dispatch sheet = Dispatch.get(workbook, "Worksheets").toDispatch();  
Dispatch.call(sheet, "Select", new Object[]{"Sheet2"}).toDispatch();

このコードは、次の例外を生成します。com.jacob.com.ComFailException:名前をdispidにマップできません:ワークシート

2 .; ブックを保存できませんでした:

// Save the open workbook as "C:\jacob-1.16-M1\Test1.xls" file:
Dispatch.call(workbook, "SaveAs", new Variant("C:\\jacob-1.16-M1\\Test1.xls"),new   Variant("1"));

このコードは、次の例外を生成します。com.jacob.com.ComFailException:名前をdispidにマップできません:SaveAs

3 .; Java COMブリッジのJava構文に関する限り、次の単純ですが非常に一般的なExcel操作を開始する方法がわかりません。

(Javaで実装しようとしているExcel VBAコードがここに含まれています)

単一のセルの選択:Range( "A4")。Select

選択した範囲をクリップボードにコピーします。

Selection.Copy

コピー先のマルチセル範囲を選択します。

Range("D9:D17").Select

クリップボードの内容を選択範囲に貼り付けます。

ActiveSheet.Paste

シートの名前を変更する:

Sheets("Sheet2").Select
Sheets("Sheet2").Name = "MySheet2"

セルのフォーマット、テキストの例:

Selection.NumberFormat = "@"

行の削除:

Rows(intI).Select
Selection.Delete Shift:=xlUp

そしておそらく...

選択範囲を並べ替えます:

Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False,  Orientation:=xlTopToBottom

シートの最後のセルを見つけます。

ActiveSheet.Cells(65536, 1).End(xlUp).Select
intLastCellRow = Selection.Row

ご協力ありがとうございました。

PS:

アプリケーションの完全なコード:

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;

public class TestJACOBWithExcel {
public static void main(String[] args) {

String strInputDoc = "C:\\jacob-1.16-M1\\JACOBWithExcel.xls";  // file to be opened.

ComThread.InitSTA();

ActiveXComponent xl = new ActiveXComponent("Excel.Application"); // Instance of application object created.

try {
// Get Excel application object properties in 2 ways:
System.out.println("version=" + xl.getProperty("Version"));
System.out.println("version=" + Dispatch.get(xl, "Version"));

// Make Excel instance visible:
Dispatch.put(xl, "Visible", new Variant(true));

// Open XLS file, get the workbooks object required for access:
Dispatch workbook = xl.getProperty("Workbooks").toDispatch();
Dispatch.call(workbook, "Open", new Variant(strInputDoc),new Variant("1"));

Dispatch sheet = Dispatch.get(workbook, "Worksheets").toDispatch();
Dispatch.call(sheet, "Select", new Object[]{"Sheet2"}).toDispatch();

// put in a value in cell A22 and place a a formula in cell A23:
Dispatch a22 = Dispatch.invoke(sheet, "Range", Dispatch.Get, new Object[] { "A22" }, new int[1]).toDispatch();

Dispatch a23 = Dispatch.invoke(sheet, "Range", Dispatch.Get, new Object[] { "A23" }, new int[1]).toDispatch();

Dispatch.put(a22, "Value", "123.456");
Dispatch.put(a23, "Formula", "=A22*2");

// Get values from cells A1 and A2
System.out.println("a22 from excel:" + Dispatch.get(a22, "Value"));
System.out.println("a23 from excel:" + Dispatch.get(a23, "Value"));

// Save the open workbook as "C:\jacob-1.16-M1\Test1.xls" file:
Dispatch.call(workbook, "SaveAs", new Variant("C:\\jacob-1.16-M1\\Test1.xls"),new Variant("1"));

// Close the Excel workbook without saving:
Variant saveYesNo = new Variant(false);
Dispatch.call(workbook, "Close", saveYesNo);

} catch (Exception e) {
e.printStackTrace();
} finally {

// Quit Excel:
// xl.invoke("Quit", new Variant[] {});
ComThread.Release();
}

}
}
4

2 に答える 2

0

ハイ、

実際、私は今あなたの最初の質問にしか答えることができません。私はこのコードを使用しており、*.xltx テンプレート ファイルに対して適切に機能しています。

File file = new File("pathToOurTemplate");
ActiveXComponent excel = null;
  ComThread.InitSTA();
  try {
    excel = new ActiveXComponent("Excel.Application");
    Dispatch excelObject = excel.getObject();
    Dispatch workbooks = excel.getProperty("Workbooks").toDispatch();
    Dispatch workbook = Dispatch.call(workbooks, "Add", file.getAbsolutePath()).toDispatch();
} catch (...) 
//...

少なくとも Office 2010、Java6_u23、Jacob 1.15_M4 で動作します

これが最初のショットに役立つことを願っています/これは、例に示されているよりも必要なものです (それらを見ていたと思います)。

于 2012-03-12T18:27:35.533 に答える
0

免責事項:この回答では、混乱を避けるために、MS Excel オブジェクトのプロパティ、メソッド、およびオブジェクト タイプを二重引用符で囲みます。この質問に対する私の答えは次のとおりです。

やあ、

Excel API が持つ階層を理解することが重要です。また、階層の各レベルで使用できるメソッド、プロパティ、またはイベントの種類も検索します。私は今あなたの質問に答えるつもりです.

質問1では、間違ったタイプのオブジェクトでプロパティ「ワークシート」を取得しているため、正しいワークシートを開くことができないと言います。コード スニペットで

Dispatch sheet = Dispatch.get(workbook, "Worksheets").toDispatch();
Dispatch.call(sheet, "Select", new Object[]{"Sheet2"}).toDispatch();

タイプ「Workbooks」のオブジェクトでプロパティ「Worksheets」を取得しますが、これは正しくありません。このドキュメントhttps://msdn.microsoft.com/EN-US/library/office/ff841074.aspxは、「ワークブック」に「ワークシート」プロパティがないことを示しています。問題は、具体的な「ワークブック」オブジェクトを開く方法にあります。

Dispatch workbook = xl.getProperty("Workbooks").toDispatch();
Dispatch.call(workbook, "Open", new Variant(strInputDoc),new Variant("1"));

「Workbooks」オブジェクトでメソッド「Open」を呼び出します。ドキュメントによれば、このメソッドがあり、MS Excel が開きます。問題は、変数「Dispatch workbook」が「Workbooks」タイプのオブジェクトであり、「Workbook」ではなく、誤って想定したことです。正しい方法は、「Open」メソッド呼び出しの戻り値を保存することです。これにより、具体的な「Workbook」オブジェクトが得られ、その後、そのタイプのオブジェクトで使用可能なメソッドが使用されます。https://msdn.microsoft.com/en-us/library/office/ff194819.aspxの MS ドキュメントに正確に従ってください。

具体的なワークシートを開く正しい方法は次のようになります。

//get "Workbooks" property from "Application" object
Dispatch workbooks = xl.getProperty("Workbooks").toDispatch();
//call method "Open" with filepath param on "Workbooks" object and save "Workbook" object
Dispatch workbook = Dispatch.call(workbooks, "Open", new Variant(strInputDoc)).toDispatch();
//get "Worksheets" property from "Workbook" object
Dispatch sheets = Dispatch.get(workbook, "Worksheets").toDispatch();
//Call method "Select" on "Worksheets" object with "Sheet2" param   
Dispatch.call(sheets, "Select", new Object[]{"Sheet2"}).toDispatch();
//probably again save "Worksheet" object and continue same way

問 2 は問 1 と同じ問題です。

//calling method "SaveAs" on "Workbooks" object instead of "Workbook" type
Dispatch.call(workbook, "SaveAs", new Variant("C:\\jacob-1.16-M1\\Test1.xls"),new   Variant("1"));

他のすべての質問は、前の 2 つとまったく同じ原則です。正しい MS オブジェクトのプロパティを取得するか、メソッドを呼び出します。また、Java-Excel 通信を使用するすべての人にとって、MS ドキュメントがいかに重要であるかを十分に強調することはできません。

一部の MS オブジェクトから実際の値を取得する方法の例を挙げます。パラメータを必要とするオブジェクトのプロパティの取得は、通常の値プロパティとは少し異なるため、「Range」オブジェクト内の値が必要だとしましょう。これを行うには、最初に「Worksheet」オブジェクトにアクセスし、そこから「Range」プロパティを取得する必要があります。

//lets say we have already some "Worksheet" object
Dispatch worksheet = ...;
//we want a property "Range" of "Worksheet" object with some macro
Variant range = Dispatch.invoke(worksheet, "Range", Dispatch.Get, new Object[]{"A1:L10"}, new int[1]);
//according to docu, you can specify format in which the value is returned
//im using 12 which is one of XML formats available
//in case no such param is provided default "textTable" format is returned
Variant value = Dispatch.invoke(range.getDispatch(), "Value", Dispatch.Get, new Object[]{12}, new int[1]);
//and get the value from it and you are done with MS Excel-Java communication
String xmlFormat = value.toString();



Worksheet.Range property docu:
msdn.microsoft.com/en-us/library/office/ff836512.aspx
Range.Value docu:
msdn.microsoft.com/en-us/library/office/ff195193.aspx

2 つ以上のリンクを投稿することは許可されていないため、これらのリンクが正しく機能していない場合は申し訳ありません。

于 2016-12-02T10:43:48.727 に答える