.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は古いだろうと云うことで変えたのだ。
*
テストアプリのエクセルにコピーするコード。
これは、書式を設定するくらいしか、回避方法はないのかしら。
アプリを使っているお客さんから、「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と組み合わせるとおかしくなる?
どちらにせよ、困ったものだ。
どちらにせよ、困ったものだ。
*
テストアプリのエクセルにコピーするコード。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using sysExcel = Microsoft.Office.Interop.Excel; namespace copyDll { public class ExcelTest { public void doTest() { sysExcel.Application xlsApp; // Excelオブジェクト xlsApp = new sysExcel.Application(); xlsApp.Visible = true; sysExcel.Workbook wb = xlsApp.Workbooks.Add(Type.Missing); sysExcel.Worksheet ws = (sysExcel.Worksheet)wb.Worksheets[1]; { sysExcel.Range ra; ra = ws.Range["A1"]; ra.Value2 = System.Environment.Version.ToString(); ra = ws.Range["B1"]; ra.Value2 = "01-6413"; ra = ws.Range["C1"]; ra.Value = "01-5598"; } } } }
これは、書式を設定するくらいしか、回避方法はないのかしら。
解決策
試しにセルの書式を文字列に設定してみると、日付値に変わるのは回避できた。しかし、面倒だなあ。ra = ws.Range["B1"]; ra.NumberFormat = "@"; // 書式を「文字列」 ra.Value2 = "01-6413"; v = ra.Value2;
コメント
コメントを投稿