質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

C#でExcel開こうとしたらエラーが出てしまう

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 116

gaki14

score 15

前提・実現したいこと

ボタンをクリックするとExcelファイルが開くようなプログラムを作成しています.

発生している問題・エラーメッセージ

ビルドはできるのですが,ボタンを押すとApp.g.i.csというファイルが勝手に開き,
下のようなメッセージが表示されてしまいます.
どうすればよいか分からないので教えていただけると助かります.

System.IO.FileLoadException: Could not load file or assembly 'Microsoft.Office.Interop.Excel, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c'. Operation is not supported. (Exception from HRESULT: 0x80131515) ---> System.NotSupportedException: A Primary Interop Assembly is not supported in AppX.
   --- End of inner exception stack trace ---
   at UWPApp1.BlankPage1.Button1_Click(Object sender, RoutedEventArgs e)

該当のソースコード

// 空白ページの項目テンプレートについては、https://go.microsoft.com/fwlink/?LinkId=234238 を参照してください

namespace UWPApp1
{
    /// <summary>
    /// それ自体で使用できる空白ページまたはフレーム内に移動できる空白ページ。
    /// </summary>
    public sealed partial class BlankPage1 : Page
    {

        Stopwatch sw = new Stopwatch();

        private uint _PenID;
        private Point _PrevPoint;
        private DispatcherTimer timer;
        private int count;
        private Excel.Application mExcel;//Excel自体
        private Excel.Workbook mWorkbook;//Excelブック
        private Excel.Worksheet mSheet;//Excelシート
        private bool isNewXlsFile = true;//Excel新規ファイルかどうか(新規:true 既存:false)



        public BlankPage1()
        {
            this.InitializeComponent();

            InkCanvas.PointerPressed += InkCanvas_PointerPressed;
            InkCanvas.PointerMoved += InkCanvas_PointerMoved;
            InkCanvas.PointerReleased += InkCanvas_PointerReleased;
            InkCanvas.PointerExited += InkCanvas_PointerExited;

        }
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            SystemNavigationManager.GetForCurrentView().AppViewBackButtonVisibility = Frame.CanGoBack ?
                AppViewBackButtonVisibility.Visible : AppViewBackButtonVisibility.Collapsed;
            SystemNavigationManager.GetForCurrentView().BackRequested += hogehoge;
            base.OnNavigatedTo(e);

            this.timer = new DispatcherTimer();

            this.timer.Interval = TimeSpan.FromSeconds(1);

            this.timer.Tick += Timerevent;
            this.timer.Start();

        }
        private void hogehoge(object obj, Windows.UI.Core.BackRequestedEventArgs e)
        {
            if (Frame.CanGoBack)
            {
                Frame.GoBack();
                if (e != null)
                    e.Handled = true;
            }
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            hogehoge(sender, null);
        }


        //①ペンや指が触れた時や,マウスの左ボタンを押したとき
        void InkCanvas_PointerPressed(object sender, PointerRoutedEventArgs e)
        {


            sw.Start();


            LogText.Text = "InkCanvas_PointerPressed --------------------------------------------";
            OutputPointerData(e);

            PointerPoint po = e.GetCurrentPoint(InkCanvas);

            //もしデバイスが〇〇ならIDと現在位置を記憶(あとで使用する)
            if(po.PointerDevice.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
            {
                _PenID = po.PointerId;
                _PrevPoint = po.Position;
            }

            e.Handled = true;
        }

        //②ポインターが移動したとき
        void InkCanvas_PointerMoved(object sender, PointerRoutedEventArgs e)
        {
            LogText.Text = "InkCanvas_PointerMoved --------------------------------------------";
            OutputPointerData(e);

            //もしデバイスがPressの時と同じなら
            if(e.Pointer.PointerId == _PenID)
            {
                PointerPoint po = e.GetCurrentPoint(InkCanvas);
                Point currentPoint = po.Position;

                //もし,Pressの位置から動いたら
                if(GetPointDistance(_PrevPoint, currentPoint) > 0)
                {
                    //線の作成
                    Line l = new Line();
                    l.X1 = _PrevPoint.X;
                    l.Y1 = _PrevPoint.Y;
                    l.X2 = currentPoint.X;
                    l.Y2 = currentPoint.Y;

                    //線を円形にする
                    l.StrokeStartLineCap = PenLineCap.Round;
                    l.StrokeEndLineCap = PenLineCap.Round;

                    //線の太さ
                    l.StrokeThickness = 10;

                    //線の色
                    l.Stroke = new SolidColorBrush(Colors.Red);

                    //線を追加
                    InkCanvas.Children.Add(l);

                    //現在の位置を保存する
                    _PrevPoint = currentPoint;

                }
            }

            e.Handled = true;
        }

        //③ペンや指が離れた時や,マウスの左ボタンを離したとき
        void InkCanvas_PointerReleased(object sender, PointerRoutedEventArgs e)
        {
            sw.Stop();
            LogText.Text = "InkCanvas_PointerReleased --------------------------------------------";
            OutputPointerData(e);

            if(e.Pointer.PointerId == _PenID)
            {
                _PenID = 0;
            }

            e.Handled = true;
        }

        //④ポインターがコントロール外に移動したとき
        void InkCanvas_PointerExited(object sender, PointerRoutedEventArgs e)
        {
            LogText.Text = "InkCanvas_PointerExited --------------------------------------------";
            OutputPointerData(e);
        }

        // PointerRoutedEventArgsの情報を出力する
        private void OutputPointerData(PointerRoutedEventArgs e)
        {
            // InkCanvasに対する情報を取得する
            PointerPoint po = e.GetCurrentPoint(InkCanvas);


            ///////////////////////////////////////
            // 各デバイスに合わせた情報を表示する//
            ///////////////////////////////////////

            //①使用デバイスがマウスのとき
            if(po.PointerDevice.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Mouse)
            {
                //マウス
                LogText.Text += "\n     DeviceType : Mouse";
                //筆圧
                LogText.Text += "\n     Pressure : " + po.Properties.Pressure;
                //時間
                LogText.Text += "\n     Time : " + sw.ElapsedMilliseconds / 1000.0;
            }
            //②使用デバイスがペンのとき
            else if (po.PointerDevice.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Pen)
            {
                // ペン
                LogText.Text += "\n     DeviceType : Pen";
                //筆圧
                LogText.Text += "\n     Pressure : " + po.Properties.Pressure;
                //消しゴムかどうか
                LogText.Text += "\n     IsEraser : " + po.Properties.IsEraser;
            }
            //③使用デバイスが指のとき
            else if (po.PointerDevice.PointerDeviceType == Windows.Devices.Input.PointerDeviceType.Touch)
            {
                //タッチ
                LogText.Text += "\n     DeviceType : Touch";
                //タッチの領域
                LogText.Text += "\n     ContactRect : (" + (int)po.Properties.ContactRect.Width + "," + (int)po.Properties.ContactRect.Height + ")";
            }

            //現在のポインターの座標
            LogText.Text += "\n     Position : (" + (int)po.Position.X + "," + (int)po.Position.Y + ")";

        }

        //2点間の距離
        public double GetPointDistance(Point po1, Point po2)
        {
            return Math.Sqrt(Math.Pow(po2.X - po1.X, 2) + Math.Pow(po2.Y - po1.Y, 2));
        }
        //タイマーイベント内容
        private void Timerevent(object sender, object e)
        {
            this.count++;
            CounterText.Text = "\n     Counter : " + count;

        }




        //Excelボタン押したとき
        private void Button1_Click(object sender, RoutedEventArgs e)
        {
            //アプリケーションのインスタンス作成
            this.mExcel = new Excel.Application();

            //Excelのウィンドウを表示:true,非表示:false
            this.mExcel.Visible = true;

            this.mWorkbook = mExcel.Workbooks.Add();
            /*
            if (this.isNewXlsFile)//新規ファイルか判定するフラグ
            {
                //ファイル新規オープン
                this.mWorkbook = mExcel.Workbooks.Add();
            }
            else
            {
                //既存ファイルオープン
                this.mWorkbook = (Excel.Workbook)(mExcel.Workbooks.Open(
                "",
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing,
                Type.Missing));

            }*/


            //シ-トを取得する
            Excel.Worksheet SheetSample = (Excel.Worksheet)this.mWorkbook.Sheets[0];

            //値を「A1」に代入
            SheetSample.Range["A1"].Value = "文字列を入力";

            //保存
            this.mWorkbook.Save();

            //ブックをクローズする
            this.mWorkbook.Close();

            //最終処理
            if(null != this.mExcel)
            {
                //警告無視設定
                this.mExcel.DisplayAlerts = false;

                //アプリケーションの終了
                this.mExcel.Quit();

                //アプリケーションのオブジェクトの解放
                System.Runtime.InteropServices.Marshal.ReleaseComObject(this.mWorkbook);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(this.mExcel);
            }



        }

    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正の依頼

  • Y.H.

    2019/10/10 17:25

    > ファイルまたはアセンブリ「Microsoft.Office.Interop.Excel、Version = 15.0.0.0、Culture = neutral、PublicKeyToken = 71e9bce111e9429c」をロードできませんでした。 操作はサポートされていません。 (HRESULTからの例外:0x80131515)---> System.NotSupportedException:プライマリ相互運用機能アセンブリはAppXではサポートされていません。

    UWPアプリではMicrosoft.Office.Interop.Excelはサポートされていません。

    キャンセル

  • gaki14

    2019/10/15 11:52

    そうなんですか!
    ネット検索で出てきたものを参考に作っていたのですが,サポートされていなかったなんて…
    教えていただきありがとうございます!

    キャンセル

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる