【解決方法】ハイパーリンクが正しく表示されないのはなぜですか?


こんにちは。SQL クエリからデータを取得し、そのデータを Excel ファイルに読み込みます。 最初は、読み込みに 5 分程度かかるため、Interop を使用するにはデータ量が多すぎます。 そのため、CSV ファイルの場合と同様に、SQL クエリから新しい Excel ファイルにデータを読み込みます。

C#
using (FileStream sw = File.Create(tempPath))
                {
                    var data = Encoding.Unicode.GetBytes("Artikelnummer" + "\t" + "Hersteller" + "\t" + "Beschreibung" + "\t" + "Nettopreis" + "\t" + "Bruttopreis" + "\t" + "Zustand" + "\t" + "P/N" + "\t" + "Kategorie I" + "\t" + "Kategorie II" + "\t" + "Kategorie III" + "\t" + "Shop-Link" + "\n");
                    sw.Write(data, 0, data.Length);

                    foreach (DataRow r in newsletter.Rows)
                    {
                        data = Encoding.Unicode.GetBytes(r["Artikelnummer"].ToString() + "\t" + r["Hersteller"].ToString() + "\t" + r["Bezeichnung"].ToString() + "\t" + r["Nettopreis"].ToString() + "\t" + r["Bruttopreis"].ToString() + "\t" + r["Zustand"].ToString() + "\t" + r["PN"].ToString() + "\t" + r["Kategorie I"].ToString() + "\t" + r["Kategorie II"].ToString() + "\t" + r["Kategorie III"].ToString() + "\t" + r["Link"].ToString() + "\n");
                        sw.Write(data, 0, data.Length);
                    }

                }

SQL クエリから取得したデータには、ハイパーリンクを含む列が 1 つあります。 そのように見えます:

=HYPERLINK(“www.example”)

新しい Excel ファイルにデータをロードする方法で、ハイパーリンクが正しい表示テキストでファイルに正しく表示されるようになりました。

これに関する問題は、プログラムを起動すると、ファイルが破損しているというメッセージが表示されることです。 これは、CSV の方法で xls ファイルを作成したためです。

私が試したこと:

私はこのエラーメッセージを表示したくないし、ハイパーリンクを機能させたいので、Interop Excel を使用して完全な SQL クエリを直接ロードするには時間がかかるため、以前のようにファイルを作成することを選択しましたが、Interop を使用してファイルを次のように保存します。そのようなコードを含む実際のExcelファイル:

C#
Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
             Workbook wb = app.Workbooks.Open(tempPath, 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);
             Worksheet ws2 = (Worksheet)wb.Worksheets[1];


             ws2.Columns.AutoFit();
             wb.SaveAs(newsView.path + "newsletter.xlsx", XlFileFormat.xlOpenXMLWorkbook, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlExclusive, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
             wb.Close();
             app.Quit();

エラーメッセージなしで実際のExcelファイルを作成していますが、Excelファイルを調べると、ハイパーリンクが機能していません。セルには、編集するようにセルを入力した場合にのみ、完全なハイパーリンク文字列があります次に、セルを直接離れると、ハイパーリンクが機能します。

ハイパーリンク文字列をセルに入れるだけでなく、列全体が自動的に機能するハイパーリンクになるようにするにはどうすればよいですか。

私がすでに試したことは次のようなものでした:

C#
Microsoft.Office.Interop.Excel.Range range = ws2.Columns[3];

foreach (Microsoft.Office.Interop.Excel.Range cell in range)
{
    object cellValue = cell.Value;
    string cellValueString = cellValue as string;
    cell.Hyperlinks.Add(cell, cellValueString);
}

この特定の列のすべてのセルを実行して、完全なハイパーリンクである値を取得し、このように特定のハイパーリンクとして追加しようとしましたが、それも機能しませんでした。

解決策 1

相互運用機能を使用するのではなく (これは遅く、Office がインストールされている必要があり、 「無人」アプリケーションからは機能しません[^]) またはCSVファイルを生成し、それが実際のExcelファイルであると「ふりをする」場合は、次を使用して適切なExcelファイルを生成してみてください OpenXML SDK[^] または次のようなラッパーライブラリ ClosedXML[^].

2007 年より前の古い Excel 形式のファイルを生成する必要がある場合は、 NPOI[^] トリックを行います。

どちらのオプションも、Office 相互運用機能よりも大幅に高速であり、ファイルを開いたときに “破損したファイル” の警告は生成されません。

コメント

タイトルとURLをコピーしました