1

コマンドライン アプリケーションを使用して、Excel アドイン (コード 1 の例) によって作成されたワークブックでホストされている listObject の情報を更新しようとしています。

Excel のインスタンスを作成してすべての listObject にアクセスしようとしましたが、GetVstoObject は常に null オブジェクトを返します。セキュリティ上の問題だと思いますが、解決方法がわかりません。(コード 2 の例)。

ServerDocumentsを試してみましたが、CachedDataがなく、アプリケーション アドイン レベルでは使用できません。なにか提案を?

前もって感謝します。

コード1

using System;    
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using Microsoft.Office.Tools.Excel;
using Microsoft.Office.Tools.Excel.Extensions;
namespace ExcelAddIn2{
public partial class ThisAddIn{
    private void ThisAddIn_Startup(object sender, System.EventArgs e){            
        DataTable theDataTable = GetDataTable();
        Workbook workbook =  Globals.ThisAddIn.Application.ActiveWorkbook.GetVstoObject();            
        Worksheet worksheet = ((Excel.Worksheet)workbook.Worksheets[1]).GetVstoObject();            
        Excel.Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, 1]];
        Excel.ListObject interopList = worksheet.ListObjects.Add(Microsoft.Office.Interop.Excel.XlListObjectSourceType.xlSrcRange, Type.Missing, Type.Missing, Microsoft.Office.Interop.Excel.XlYesNoGuess.xlNo,range);
        ListObject list = interopList.GetVstoObject();                         
        list.Name = "myListObject";
        list.DataSource = theDataTable;            
        workbook.SaveCopyAs(@"C:\theExcel.xlsx");
    }

    private DataTable GetDataTable() {
        /*Datatable example, I'm using my implementation of a OleDBCommand to get it*/
        DataTable table = new DataTable("myTable");                                   
        DataColumn columnId = new DataColumn();
        columnId.DataType = System.Type.GetType("System.String");
        columnId.ColumnName = "id";            
        DataColumn columnName = new DataColumn();
        columnName.DataType = System.Type.GetType("System.String");
        columnName.ColumnName = "Name";
        table.Columns.Add(columnId);
        table.Columns.Add(columnName);
        DataRow row;
        for (int i = 0; i <= 2; i++){
            row = table.NewRow();
            row["id"] = i;
            row["Name"] = "Name " + i;
            table.Rows.Add(row);
        }
        return table;            
     }
     ..etc..

Code2 参照: Microsoft.Office.Interop.Excel、Microsoft.Office.Tools.Common.v9.0、Microsoft.Office.Tools.Excel.v9.0、Microsoft.Office.Tools.v9.0、Microsoft.VisualStudio.Tools .Applications.Runtime.v9.0、System.Windows.Forms (それが必要 ¿?)

using System;
using System.Data;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;
using Microsoft.Office.Tools.Excel.Extensions;
using System.Reflection;
namespace ConsoleApplication1{
 class Program {
static void Main(string[] args)
{
 Excel.Application app = new Excel.ApplicationClass();
 Excel.Workbook excelWorkbook = app.Workbooks.Open(@"C:\theExcel.xlsx",
             Type.Missing, true, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing, Type.Missing, Type.Missing,
             Type.Missing, Type.Missing);
 Microsoft.Office.Tools.Excel.Worksheet worksheet = ((Excel.Worksheet)excelWorkbook.Worksheets[1]).GetVstoObject();
 foreach (ListObject list in worksheet.ListObjects) {
  list.DataSource = GetNewDataTable();
 }
 app.Quit();
}
private static DataTable GetNewDataTable()
{
 DataTable table = new DataTable("myTable");
 DataColumn columnId = new DataColumn();
 columnId.DataType = System.Type.GetType("System.String");
 columnId.ColumnName = "id";
 DataColumn columnName = new DataColumn();
 columnName.DataType = System.Type.GetType("System.String");
 columnName.ColumnName = "Name";
 table.Columns.Add(columnId);
 table.Columns.Add(columnName);
 DataRow row;
 for (int i = 0; i <= 2; i++)
 {
  row = table.NewRow();
  row["id"] = i;
  row["Name"] = "New Name " + i;
  table.Rows.Add(row);
 }
 return table;
  }
 }
}
4

0 に答える 0