Як я можу відмовити Excel їсти свої смачні файли CSV та видаляти непотрібні дані?


128

У мене є база даних, яка відстежує продажі віджетів за серійним номером. Користувачі вводять дані та кількість покупця та сканують кожен віджет у користувацькій клієнтській програмі. Потім вони доопрацьовують замовлення. Це все працює бездоганно.

Деякі клієнти хочуть використовувати сумісну з Excel електронну таблицю придбаних віджетів. Ми створюємо це за допомогою PHP-скрипту, який запитує базу даних та видає результат у вигляді CSV із назвою магазину та пов’язаними даними. Це теж прекрасно працює.

Відкриваючись у текстовому редакторі, такому як «Блокнот» або «vi», файл виглядає приблизно так:

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

Як бачите, серійні номери присутні (у цьому випадку двічі, не всі вторинні серіали однакові) і є довгими рядками чисел. Коли цей файл відкриється в 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 років.


46
чи можу я дати +1 лише за ім’я?
tombull89

11
Excel does not seem to respect text qualifiers in .csv files- подвійні лапки не є текстовими класифікаторами, вони просто дозволяють коми у ваших даних, якщо ви не використовуєте коми у своїх даних, то вони безглузді . Усі дані у файлі CSV не типізовані, тому Excel може лише здогадуватися, що ваш великий серійний номер - це число , і це тоді, коли ви наштовхнетесь на Excel з максимальною точністю 15 цифр, і це те, що обрізає ваші номери.
DMA57361

1
Схоже, Excel не поважає всі коми в подвійних лапках. Розглянемо "12 серпня 2012 року" Excel перетворює це і на сміття.
zundarz

5
Я хочу згадати це питання СУ . Він пояснює, які варіанти у вас є при роботі з CSV в Excel.
nixda

1
@nixda Дякую! Це корисні пропозиції, особливо для більш досвідчених користувачів. Моя проблема - це майже більше людська проблема, в тому, що Excel асоціюється з .csv файлами, і люди бачать іконку, і двічі клацніть (тому що ви відкриваєте речі), а потім зазвичай натискаєте кнопку Save (тому що ми завжди говоримо їх зберегти!), і все втрачено. Але я обов'язково буду використовувати ваші методи, коли це можливо.
atroon

Відповіді:


58

Але Excel, безумовно, перетворює ці файли у непотрібне сміття.

Excel - марний сміття.

Рішення

Я був би трохи здивований, якби жоден клієнт, який бажає ваших даних у форматі Excel, не зміг змінити видиме форматування у цих трьох стовпцях на "Число" з нульовими десятковими знаками або на "текст". Але припустимо, що короткий документ про те, як зробити документ, не підлягає.

Ваші варіанти:

  1. Вкиньте не серійний, а не пробільний символ у свої серійні номери.
  2. Випишіть файл xls або файл xlsx з деяким форматуванням за замовчуванням.
  3. Обмацуйте та виведіть ці числа як формули ="268435459705526269","",="268435459705526269"(ви також можете ="268435459705526269",,="268435459705526269"зберегти себе 2 символи). Це має перевагу в правильному відображенні та, ймовірно, загалом корисним, але тонко розбитим (як це формули).

Будьте обережні з варіантом 3, тому що деякі програми (включаючи Excel & Open Office Calc), більше не будуть розглядати коси всередині =""полів як відхилені. Це означає, що ="abc,xyz"охопить два стовпці та порушить імпорт.

Використання формату "=""abc,xy"""вирішує цю проблему, але цей метод все ж обмежує вас до 255 символів через обмеження довжини формули Excel.


1
Насправді, це не бути суворим. Скопіюйте і вставте одне з номерів вище в Excel, а потім змініть формат чисел, як було запропоновано. Excel змінює значення, в результаті чого виходить сміття.
Joe Internet

1
@ Джо, я був занадто прискіпливим у своєму первинному огляді. Excel справді виробляє сміття, і сам є сміттям. Я оновив свою відповідь, щоб це відобразити. Можливим може бути "Excel csv", а також "придатний для використання csv"
Тайлер,

2
@Tyler - Я не думаю, що Excel є сміттям, просто кажу, що ОП було правильним, що в цьому випадку він виробляє сміття. Це насправді дуже гарне питання, без начебто елегантного рішення.
Joe Internet

1
Запропоновано параметр Формат ячеек ..., і я спробував його використовувати. У цьому випадку, коли ви відкриєте файл, Excel, здається, перетворює серіали в Наукові нотації (погоджено, не несподівано) і кидає точність. Коли ви змінюєте їх на номер або на текст, рядок не повертається. У цьому насправді суть проблеми. Виведення як формули може це зробити, хоча ... Я про це не думав.
atroon

9
@ DMA57361 Поведінка не очікується, вона визначальна. Числова точність добре зафіксована, як excel читає CSV - це не так. Відсутність попередження та мовчазного відкидання даних є абсурдом. Те, що ви навіть не можете розповісти Excel, як імпортувати дані, так само абсурдно. Чи потрібен негатив ? Ні, але чесність - це найкраща політика, і саме так я відчуваю.
Тайлер

42

У нас була подібна проблема, коли у нас були файли CSV зі стовпцями, що містять діапазони, такі як 3-5, а Excel завжди перетворював би їх на дати, наприклад, 3-5 було б 3 березня, після чого перехід назад до числового давав нам марне ціле число дати. Ми його обійшли

  1. Перейменування розширення CSV на TXT
  2. Тоді, коли ми відкрили його в Excel, це запустить майстра імпорту тексту
  3. На кроці 3 із 3 майстра ми розповіли, що стовпці, про які йдеться, були текстовими та вони належним чином імпортували.

Ви могли б зробити те саме тут, я б подумав.

майстер імпорту тексту

Ура


2
+1 за те, що це правильний спосіб зробити це. (Редагування: шкода було змінити трохи уточнити рішення)
JAY

2
Вам не потрібно перейменовувати файл. Просто скористайтеся майстром імпорту Shift - виберіть усі стовпці та виберіть як текст.
nixda

1
Майстер імпорту тексту - це відповідь. Усі інші рішення - непотрібні хакерські дії, які не розуміють, як використовувати Excel для перегляду та редагування CSV-файлів.
Excellll

1
@Excellll, роблячи це одночасно одним файлом. Автоматизуючи цей процес, "непотрібне хакерство" часто економить день.
Чоловік Парріш

1
це абсолютно марно, коли excel використовується звичайними користувачами для відображення файлів CSV. перш ніж я спробую пояснити, як користуватися майстром текстового імпорту для ~ 15 користувачів офісу для початківців, я краще введу вихідний код документа excel самостійно.
northkildonan

8

Кращим рішенням є створення 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 відкривають його правильно.


Ви маєте на увазі, що ОП повинен використовувати скрипт PHP для перетворення бази даних у формат XML?
Прасанна

2
Набагато чистіше, ніж користувачі відкривають .csv в Excel або псують ваш CSV, щоб тільки Excel міг зрозуміти ваш CSV. Це навіть не такий комплекс схеми.
бінкі

Де цей документ задокументований? Я хотів би дізнатися більше про наявні типи даних.
Джон Догерті

1

Моє рішення: У мене та сама проблема із імпортом серійних номерів. Вони не повинні розглядатися як числа, тобто ніякі математичні функції на ньому не виконуються, але нам потрібно все число. Найпростіша річ - вставити пробіл у порядковий номер. наприклад, "12345678 90123456 1234". Коли Excel імпортує його, він буде розглядатися як текст, а не числовий.


0

У мене були довгі номери рахунків.

Ось як я це виправив:

Відкрийте файл file.csv у Libre Office / Open Office (можливо, вам доведеться вказати роздільники тощо), а потім збережіть його як файл XML Excel.

Потім відкрийте цей файл у Excel, і тоді ви побачите, що стовпці більше не змінюються в науковий формат чи будь-який інший. Для безпечного клацання правою кнопкою миші на стовпчику та явно встановіть формат як текст, а потім збережіть як формат файлу Excel.

Відкрийте файл формату Excel і стовпець все одно повинен бути нормальним!


1
У той час як це буде працювати, намагаючись пояснити кому - то , хто говорить тільки на ламаною англійською , чому він повинен був би використовувати інший офісний пакет створює стільки ж проблем , як це вирішує. На мою думку, альтернативне програмне забезпечення для M $ Office - це все добре, але я усвідомлюю, що не можу всіх перетворити.
atroon

0

Майстер імпорту - найкраще рішення для випадкових користувачів та разових ситуацій. Якщо вам потрібно програмне рішення, ви можете скористатися методом QueryTables.Add (який використовується майстер імпорту за кадром).

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.