.NET Framework 3.5.1 と 4.6.2 でVSTOの動作が違う

エクセルにデータを貼り付けるアプリをC#で作っているのだけど、.NET Frameworkのバージョンの違いで動作が違うことに気がついたので、記録しておきます。


アプリを使っているお客さんから、「01-6413」が「1648342」と変な値でコピーされると問い合わせがあった。つまり、ハイフォン「-」を含む数字をエクセルにコピーすると化ける。

しかしアプリは何も変えていなくて、ターゲットフレームワークを .NET Framework 3.5.1 から 4.6.2 に変えたことくらい。さすがに3.5は古いだろうと云うことで変えたのだ。

テストアプリを作って試してみたところ、.NET Framework 3.5.1用にビルドしたアプリと、4.6.2用にビルドしたアプリで動作が違うことがわかった。

(例)「01-6413」をB1セルにコピーしたとき
  • .NET Framework 3.5.1用にビルドしたアプリ 「01-6413」がコピーされる
  • .NET Framework 4.6.2用にビルドしたアプリ 「6413/1/1」がコピーされる

なに、これ?

「-」付きのデータを見て思い出されるのは、エクセルが勝手に日付に変換してしまう機能(たとえば「7-20」と入力すると「7/20」にされてしまう)だけど、さすがに「01-6413」を6413/1/1に変換するのはおかしくないかい?

エクセルを開いて「01-6413」と手入力したら、そのまま入力されたので、アプリ側でデータを変換して、エクセルにコピーしているのだろうか。VSTOのバグなのか?.NET Framework 4.6.2と組み合わせるとおかしくなる?

どちらにせよ、困ったものだ。



テストアプリのエクセルにコピーするコード。

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5.  
  6. using sysExcel = Microsoft.Office.Interop.Excel;
  7.  
  8. namespace copyDll
  9. {
  10.     public class ExcelTest
  11.     {
  12.         public void doTest()
  13.         {
  14.             sysExcel.Application xlsApp; // Excelオブジェクト
  15.  
  16.             xlsApp = new sysExcel.Application();
  17.             xlsApp.Visible = true;
  18.  
  19.             sysExcel.Workbook wb = xlsApp.Workbooks.Add(Type.Missing);
  20.             sysExcel.Worksheet ws = (sysExcel.Worksheet)wb.Worksheets[1];
  21.  
  22.             {
  23.                 sysExcel.Range ra;
  24.  
  25.                 ra = ws.Range["A1"];
  26.                 ra.Value2 = System.Environment.Version.ToString();
  27.  
  28.                 ra = ws.Range["B1"];
  29.                 ra.Value2 = "01-6413";
  30.  
  31.                 ra = ws.Range["C1"];
  32.                 ra.Value = "01-5598";
  33.             }
  34.         }
  35.     }
  36. }

これは、書式を設定するくらいしか、回避方法はないのかしら。

解決策

試しにセルの書式を文字列に設定してみると、日付値に変わるのは回避できた。しかし、面倒だなあ。

  1.                 ra = ws.Range["B1"];
  2.                 ra.NumberFormat = "@";  // 書式を「文字列」
  3.                 ra.Value2 =  "01-6413";
  4.                 v = ra.Value2;

コメント

このブログの人気の投稿

varchar をデータ型 numeric に変換中に、算術オーバーフロー エラーが発生しました。