web-dev-qa-db-ja.com

ExcelがおいしいCSVファイルを食べ、無駄なデータを排出したいののを防ぐにはどうすればよいですか。

シリアル番号でウィジェットの売上を追跡するデータベースがあります。ユーザーは購入者のデータと数量を入力し、各ウィジェットをカスタムクライアントプログラムにスキャンインします。その後、彼らは注文を確定します。これはすべて完璧に動作します。

一部の顧客は、購入したウィジェットのExcel互換スプレッドシートを望んでいます。データベースをクエリし、その結果をストア名と関連データを含むCSVとして出力するPHPスクリプトを使用してこれを生成します。これも完璧に機能します。

メモ帳やviなどのテキストエディタで開くと、ファイルは次のようになります。

"Account Number","Store Name","S1","S2","S3","Widget Type","Date"
"4173","SpeedyCorp","268435459705526269","","268435459705526269","848 Model Widget","2011-01-17"

ご覧のとおり、シリアル番号が存在し(この場合は2回、すべてのセカンダリシリアル番号が同じではありません)、長い一連の番号です。このファイルをExcelで開くと、結果は次のようになります。

Account Number  Store Name  S1  S2  S3  Widget Type Date 
4173    SpeedyCorp  2.68435E+17     2.68435E+17 848 Model Widget    2011-01-17

お分かりのように、シリアル番号は二重引用符で囲まれています。 Excelは.csvファイル内のテキスト修飾子を尊重しないようです。これらのファイルをAccessにインポートすると、問題は発生しません。テキストとして開くときは、まったく問題ありません。しかし、Excelはこれらのファイルを無駄なゴミに変換します。デフォルト以外のアプリケーションでCSVファイルを開くことについて、エンドユーザーに指示を出すのは面倒です。希望はありますか?私が見つけることができなかった設定はありますか?これはExcel 2003、2007、および2010の場合に当てはまるようです。

128
atroon

しかし、Excelはこれらのファイルを無駄なゴミに変換します。

Excelは無駄なゴミです。

溶液

Excel形式のデータを必要としているクライアントが、これら3つの列の表示形式を小数点以下の桁数が0の「数値」または「テキスト」に変更できなかった場合、少し驚きます。しかし、短いハウツー文書は問題外だと仮定しましょう。

あなたのオプションは:

  1. シリアル番号に空白ではなく、数字以外の文字を入れてください。
  2. デフォルトフォーマットでxlsファイルまたはxlsxファイルを書き出します。
  3. それらの数字をカンニングして式="268435459705526269","",="268435459705526269"として出力します(="268435459705526269",,="268435459705526269"を使用して2文字を節約することもできます)。これは正しく表示されるという利点があり、おそらく一般的には有用ですが、微妙に壊れています(式なので)。

一部のプログラム(ExcelおよびOpen Office Calcを含む)では、=""フィールド内のコンマがエスケープされたものとして扱われなくなるため、オプション3に注意してください。つまり、="abc,xyz"は2列にまたがりインポートを中断します。

"=""abc,xy"""の形式を使用すると、この問題は解決されますが、Excelの式の長さの制限により、この方法ではまだ255文字に制限されています。

58
Tyler

3〜5などの範囲を含む列を含むCSVファイルがあり、Excelがそれらを常に日付に変換するという同様の問題がありました。 3-5は3月3日になり、その後数値に戻すと無用な日付整数が得られました。我々はそれを回避しました

  1. CSVの名前をTXT拡張子に変更
  2. Excelで開くと、テキストインポートウィザードが起動します。
  3. ウィザードのステップ3/3では、問題の列はテキストであり、正しくインポートされていることがわかりました。

ここでも同じことができると思います。

text import wizard

乾杯

42
user65525

より良い解決策はXML Workbookを生成することです。このような:

<?xml version="1.0" encoding="UTF-8"?>
<?mso-application progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-Microsoft-com:office:spreadsheet" xmlns:c="urn:schemas-Microsoft-com:office:component:spreadsheet" xmlns:html="http://www.w3.org/TR/REC-html40" xmlns:o="urn:schemas-Microsoft-com:office:office" xmlns:ss="urn:schemas-Microsoft-com:office:spreadsheet" xmlns:x2="http://schemas.Microsoft.com/office/Excel/2003/xml" xmlns:x="urn:schemas-Microsoft-com:office:Excel" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <OfficeDocumentSettings xmlns="urn:schemas-Microsoft-com:office:office">
  </OfficeDocumentSettings>

  <ss:Worksheet ss:Name="Sheet 1">
    <Table>
    <Column ss:Width="100"/>
    <Column ss:Width="100"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="150"/>
    <Column ss:Width="80"/>
    <Column/>

    <Row>
      <Cell><Data ss:Type="String">Account Number</Data></Cell>
      <Cell><Data ss:Type="String">Store Name</Data></Cell>
      <Cell><Data ss:Type="String">S1</Data></Cell>
      <Cell><Data ss:Type="String">S2</Data></Cell>
      <Cell><Data ss:Type="String">S3</Data></Cell>
      <Cell><Data ss:Type="String">Widget Type</Data></Cell>
      <Cell><Data ss:Type="String">Date</Data></Cell>
    </Row>

    <Row>
      <Cell><Data ss:Type="String">4173</Data></Cell>
      <Cell><Data ss:Type="String">SpeedyCorp</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">x</Data></Cell>
      <Cell><Data ss:Type="String">268435459705526269</Data></Cell>
      <Cell><Data ss:Type="String">848 Model Widget</Data></Cell>
      <Cell><Data ss:Type="String">2011-01-17</Data></Cell>
    </Row>


    </Table>
    <x:WorksheetOptions/>
  </ss:Worksheet>
</Workbook>

ファイルの拡張子は.xmlでなければなりません。 ExcelとOpenOfficeはそれを正しく開きます。

8

私の解決策:シリアル番号のインポートについても同じ問題があります。それらは数として扱われる必要はありません、すなわち、それに対して数学関数は実行されません、しかし、我々はそこに全部の数を必要とします。私が持っている最も簡単なことはシリアル番号にスペースを挿入することです。例: "12345678 90123456 1234"。 Excelがインポートすると、数値ではなくテキストとして扱われます。

1
Peterlip

長いアカウント番号が文字化けしていました。

これは私がそれを修正した方法です:

Libre Office/Open Officeでfile.csvを開き(区切り文字などを指定する必要がある場合があります)、ファイルをExcel XMLファイルとして保存します。

Excelでこのファイルを開くと、列が科学的な形式などに変更されなくなります。安全のために列を右クリックしてフォーマットをテキストとして明示的に設定してからExcelファイルフォーマットとして保存してください。

Excel形式のファイルを開いても、列は問題ないはずです。

0
user127379

Import Wizardは、一般ユーザや一時的な状況に最適なソリューションです。プログラムによる解決策が必要な場合は、QueryTables.Addメソッドを使用できます(これはImport Wizardが裏で使用しているものです)。

Workbooks.Add
With ActiveSheet.QueryTables.Add(Connection:="TEXT;" & "C:\myfile.csv", Destination:=Range("$A$1"))
    .FieldNames = True
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .TextFilePromptOnRefresh = False
    .TextFilePlatform = 437
    .TextFileStartRow = 1
    .TextFileParseType = xlDelimited
    .TextFileTextQualifier = xlTextQualifierDoubleQuote
    .TextFileConsecutiveDelimiter = False
    .TextFileTabDelimiter = False
    .TextFileSemicolonDelimiter = False
    .TextFileCommaDelimiter = True
    .TextFileSpaceDelimiter = False
    .TextFileColumnDataTypes = Array(1, 2, 2) 'Edit this line. Add a number for each column, 1 is general, 2 is text. Search the internet for other formats.
    .TextFileTrailingMinusNumbers = True
    .Refresh BackgroundQuery:=False
End With
0
PBeezy