126

У меня есть база данных, которая отслеживает продажи виджетов по серийному номеру. Пользователи вводят данные и количество покупателя и сканируют каждый виджет в пользовательскую клиентскую программу. Затем они завершают заказ. Это все работает без нареканий.

Некоторым клиентам нужна совместимая с 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.

6 ответов6

57

Но Excel, в обязательном порядке, превращает эти файлы в бесполезный мусор.

Excel это бесполезный мусор.

Решение

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

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

  1. Вброс нецифровых, а не пробельных символов в ваши серийные номера.
  2. Запишите файл xls или файл xlsx с некоторым форматированием по умолчанию.
  3. Обманите и выведите эти числа в виде формул ="268435459705526269","",="268435459705526269" (вы также можете сделать ="268435459705526269",,="268435459705526269" сохранив себе 2 символа). Это имеет преимущество в правильном отображении и, вероятно, в целом полезном, но едва различимом (поскольку они являются формулами).

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

Использование формата "=""abc,xy""" решает эту проблему, но этот метод все еще ограничивает вас 255 символами из-за ограничения длины формулы в Excel.

42

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

  1. Переименование расширения CSV в TXT
  2. Затем, когда мы открыли его в Excel, это включило бы мастер импорта текста
  3. На шаге 3 из 3 в мастере мы сказали, что рассматриваемые столбцы были текстовыми, и они были импортированы правильно.

Вы могли бы сделать то же самое здесь, я думаю.

Мастер импорта текста

ура

9

Лучшим решением является создание 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 открывают его правильно.

1

Мое решение: у меня та же проблема с импортом серийных номеров. Они не должны рассматриваться как числа, то есть никакие математические функции не выполняются, но нам нужно полное число там. Самое простое, что у меня есть, это вставить пробел в серийный номер. например, "12345678 90123456 1234". Когда Excel импортирует его, он будет обрабатываться как текст, а не как цифра.

0

У меня были искажены длинные номера счетов.

Вот как я это исправил:

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

Затем откройте этот файл в Excel, и вы увидите, что столбцы больше не преобразуются в научный формат или что-то еще. Для безопасности щелкните правой кнопкой мыши по столбцу и явно задайте формат как Текст, затем сохраните как формат файла Excel.

Откройте файл формата Excel, и колонка должна быть в порядке!

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .