0

私は正常に動作するコードを書いています.このコードには、画像とテキストをExcelセルに転送することが含まれており、エラーが発生するクライアントコンピューターの1つで正常に動作します:

System.IO.FileNotFoundException: Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c' or one of its dependencies. The system cannot find the file specified.
File name: 'Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'

データテーブルを Excel にエクスポートするコード:

   string ImageFolderPath = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\Images\\";

        SaveFileDialog saveFileDialog1=new SaveFileDialog();
        saveFileDialog1.Filter = "Excel (*.xls)|*.xls";
       // saveFileDialog1.Title = "Select Empty Excel Sheet";
        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if (!saveFileDialog1.FileName.Equals(String.Empty))
            {
                FileInfo f = new FileInfo(saveFileDialog1.FileName);
                if (f.Extension.Equals(".xls") || f.Extension.Equals(".xlsx"))
                {
                    Microsoft.Office.Interop.Excel.Application xlApp;
                    Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
                    Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;
                    object misValue = System.Reflection.Missing.Value;

                    xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
                    xlWorkBook = xlApp.Workbooks.Add(misValue);
                    xlWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
                    int i = 0;
                    int j = 0;

                    xlWorkSheet.Cells[3, 1] = "SKU";
                    xlWorkSheet.Cells[3, 2] = "EAN IPC";
                    xlWorkSheet.Cells[3, 3] = "ASIN";
                    xlWorkSheet.Cells[3, 4] = "CONDITION";
                    xlWorkSheet.Cells[3, 5] = "PRICE";
                    xlWorkSheet.Cells[3, 6] = "PRODUCT TITLE";
                    xlWorkSheet.Cells[3, 7] = "STATUS";
                    xlWorkSheet.Cells[3, 8] = "PRODUCT IMAGE";
                    xlWorkSheet.Cells[3, 9] = "PRODUCT URL";
                    xlWorkSheet.Cells[3, 10] = "IMAGE NAME";


                    xlWorkSheet.Cells[2, 1] = "Accept Value :";
                    xlWorkSheet.Cells[2, 2] = textBox1.Text;

                    xlWorkSheet.Cells[2, 4] = "Location :";
                    xlWorkSheet.Cells[2, 5] = "Amazon.co.uk";

                    for (i = 0; i <= resultSheet.Rows.Count - 1; i++)
                    {
                        for (j = 0; j <= resultSheet.Columns.Count - 1; j++)
                        {

                            if (j == 7)
                            {
                                string imagString = Path.GetDirectoryName(System.Windows.Forms.Application.ExecutablePath) + "\\Images\\";
                                imagString = imagString + resultSheet.Rows[i][j+2].ToString();
                                Microsoft.Office.Interop.Excel.Range oRange = (Microsoft.Office.Interop.Excel.Range)xlWorkSheet.Cells[i + 5, j + 1];
                                float Left = (float)((double)oRange.Left);
                                float Top = (float)((double)oRange.Top);
                                const float ImageSize = 32;
                                xlWorkSheet.Shapes.AddPicture(imagString, Microsoft.Office.Core.MsoTriState.msoFalse, Microsoft.Office.Core.MsoTriState.msoCTrue, Left, Top, ImageSize, ImageSize);
                                oRange.RowHeight = ImageSize + 2;

                            }
                            else
                            {
                                xlWorkSheet.Cells[i + 5, j + 1] = resultSheet.Rows[i][j].ToString();

                            }
                        }
                    }

                    xlWorkBook.SaveAs(saveFileDialog1.FileName, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
                    xlWorkBook.Close(true, misValue, misValue);
                    xlApp.Quit();

                    Marshal.ReleaseComObject(xlWorkSheet);
                    Marshal.ReleaseComObject(xlWorkBook);
                    Marshal.ReleaseComObject(xlApp);
                    MessageBox.Show("Excel file created , you can find the file " + saveFileDialog1.FileName);
                }
                else
                {
                    MessageBox.Show("Invalid file type");
                }
            }
            else
            {
                MessageBox.Show("You did pick a location " +
                                "to save file to");
            }
        }

クライアントはExcel 2002を使用しているため、どうすればよいかわかりません!

4

2 に答える 2

2

Here is a quick example on how to latebind with Excel. This post also covers the following

  1. Add a New worksheet (As per your request)
  2. Rename the newly added worksheet
  3. Write to a cell

I have commented the code so you shouldn't have any problem understanding it :)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Reflection;

namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            object xlApp;
            object xlWbCol;
            object xlWb;
            object xlSheet;
            object xlRange;
            object xlWsCol;

            //~~> create new Excel instance
            Type tp;
            tp = Type.GetTypeFromProgID("Excel.Application");
            xlApp = Activator.CreateInstance(tp);

            object[] parameter = new object[1];
            parameter[0] = true;
            xlApp.GetType().InvokeMember("Visible", BindingFlags.SetProperty, null, xlApp, parameter);
            xlApp.GetType().InvokeMember("UserControl", BindingFlags.SetProperty, null, xlApp, parameter);

            //~~> Get the xlWb collection
            xlWbCol = xlApp.GetType().InvokeMember("Workbooks", BindingFlags.GetProperty, null, xlApp, null);

            //~~> Create a new xlWb
            xlWb = xlWbCol.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, xlWbCol, null);

            //~~> Get the worksheet collection
            xlWsCol = xlWb.GetType().InvokeMember("WorkSheets", BindingFlags.GetProperty, null, xlApp, null);

            //~~> Create a new workxlSheet
            xlSheet = xlWb.GetType().InvokeMember("Add", BindingFlags.InvokeMethod, null, xlWsCol, null);

            //~~> Rename the workxlSheet to your SO Handle
            xlSheet.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, xlSheet, new object[] { "confusedMind" });

            //~~> Assign cell D10 to xlRange object
            xlRange = xlSheet.GetType().InvokeMember("Range", BindingFlags.GetProperty, null, xlSheet, new object[] { "D10" });

            //~~> Write to cell D10
            xlRange.GetType().InvokeMember("Value", BindingFlags.SetProperty, null, xlRange, new object[] { "Blah Blah" });

            //~~> Release the object
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        }
    }
}

SCREENSHOT

enter image description here

FOLLOWUP

To add an image use this. Change as applicable

object xlShape;
xlShape = xlSheet.GetType().InvokeMember("Shapes", BindingFlags.GetProperty, null, xlSheet,null);
String imagString = @"C:\Image.jpg";
xlSheet.GetType().InvokeMember("AddPicture", BindingFlags.InvokeMethod, null, xlShape,
new object[] {imagString, false, true, 10, 10, 200, 200 });
于 2013-01-25T08:48:49.677 に答える
0

メッセージはかなり明確です。アプリケーションが必要とするように構築されたExcel(2007)のバージョンは、クライアントがインストールしたExcel(2002)のバージョンよりも新しいものです。

クライアントを新しいバージョンのExcel(2007)にアップグレードするか、アプリに必要なExcel相互運用機能アセンブリをダウングレードするか(古いバージョンのExcel用のアセンブリが見つかった場合)、代わりにCOM AutomationforExcelの使用に切り替えます。

于 2013-01-24T22:31:03.430 に答える