1

ファイルの拡張子に応じて、これらの接続文字列を使用しています。

  public static string ExcelConnectionString(string filePath)
  {
                OleDbConnectionStringBuilder sbConnection = new OleDbConnectionStringBuilder();
                String strExtendedProperties = String.Empty;
                sbConnection.DataSource = filePath;

            if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file
            {
                sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0";
                strExtendedProperties = "Excel 8.0";//HDR=ColumnHeader,IMEX=InterMixed
            }
            else if (Path.GetExtension(filePath).Equals(".xlsx"))  //for 2007 Excel file
            {
                sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
                strExtendedProperties = "Excel 12.0";
            }

            sbConnection.Add("Extended Properties", strExtendedProperties);

            return sbConnection.ToString();
    }

ただし、「名前を付けて保存: 2003 xls」または「名前を付けて保存: xlsx」オプションを使用せずに xls ファイルをインポートすると、. (そのため、ダウンロードしたファイルを保存しcontrol + sても機能しません。) 最終的に次のエラーが発生します。

OleDbException がユーザーコードによって処理されませんでした - 外部テーブルが予期された形式ではありません。

どうすればこれを修正できますか? control + s私のシステムは、2 つのうちの 1 つを手動で選択するのではなく、ファイルを保存するために連携する必要があります。

エクスポート後に手動でファイルを開くと、次のウィンドウが表示されるため、問題は私が作成したエクスポート*である可能性があります。

The file you are trying to open "yourfile.xls" in a different format than specified file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now? 

*エクスポート ファイルは、生成された XML ファイルを .xls として保存したものです。これを警告なしで .xls として保存する方法はありますか? control + sファイルを保存するには本当に必要です。

前もって感謝します。

要するに、上記のエラーを表示せずに、作成した XML ファイルを XLS として保存するにはどうすればよいでしょうか。外部ライブラリなしでこれを行うことが本当に不可能な場合にのみ、外部ライブラリを使用したくありません。

4

2 に答える 2

2

ファイルが実際にはネイティブの Excel 形式で保存されたスプレッドシート ファイルではないという圧倒的な証拠があります。つまり、実際の.xls または .xlsx ファイルです。

つまり、XML ファイルを変換したプログラムである、間違ったファイル名を選んだだけの厄介なプログラムと戦っているのです。このようなプログラムに適した形式は、.csv (カンマ区切り値) です。Excel が読み方を知っている形式。ただし、使用する OleDb プロバイダーはそれほどスマートではありません。接続文字列から実際の形式を知る必要があります。

接続文字列を構成する方法を知るには、ファイルに実際に何が含まれているかを知る必要があります。開始点は、ファイルの実際の内容を確認することです。16 進ビューアを使用します。意味がわからない場合は、スクリーンショットを投稿してください。または、メモ帳を使用すると、完全に読みやすいテキストが表示されると水晶玉が予測します。


それでは始まります:<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>

更新: ドキュメントは XML ファイルとしてフォーマットされています。「XML スプレッドシート 2003」形式を使用してスプレッドシートを保存することで、見出しを再現できます。予想されるファイル名拡張子は.xml. OleDb プロバイダーはドキュメントをそのまま読み取ることができないため、変換が必要です。それを処理するために、小さなコンソール モード アプリを作成できます。プロジェクト + 参照の追加、COM タブで、"Microsoft Excel xx Object Library" を選択します。コードを次のようにします。

using System;
using Excel = Microsoft.Office.Interop.Excel;

class Program {
    [STAThread]
    static int Main(string[] args) {
        var app = new Excel.Application();
        try {
            if (args.Length != 2) throw new Exception("Usage: Convert inputfile outputfile");
            var book = app.Workbooks.OpenXML(args[0]);
            System.IO.File.Delete(args[1]);
            book.SaveAs(args[1], FileFormat: Excel.XlFileFormat.xlExcel8);
            app.Quit();
            return 0;
        }
        catch (Exception ex) {
            Console.WriteLine(ex.Message);
            Console.ReadLine();
            app.Quit();
            return -1;
        }
    }
}

念のため、入力ファイルではなく、そのコンバーターの出力ファイルを確認してください。

于 2014-01-11T11:29:54.543 に答える