Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Экспорт данных листа в формате CSV (расширенный) - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
Экспорт данных листа в формате CSV (расширенный)
AndreTM Дата: Среда, 22.05.2013, 03:32 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
В последнее время я уже пару раз наткнулся на то, что народу требуется экспортировать данные с листа в обычный текст с разделителями. При этом беглое изучение поисковиков привело к неутешительным выводам - ни один из стандартных форматов экспорта Excel не решает полностью проблему совместимости с "принимающей стороной". И если от проблем с представлением даты или логических значений, ошибок - ещё можно справиться предварительной обработкой листа, то "задвоение кавычек" нерешаемо (стандартными методами) в принципе...
Поэтому я, недолго думая, настрадал собственную процедуру для экспорта, которую и представляю.
[vba]
Код
Option Explicit

Sub ExportSheet2CSV(Optional ByVal cFileName = "", _
   Optional ByVal cDelimiter = ",", Optional ByVal cTextQualifier = "", Optional ByVal cDecimalSeparator = ".", _
   Optional ByVal nStartRow = 1, Optional ByVal nStartCol = 1, _
   Optional ByVal vCutHeader As Variant = True, _
   Optional ByVal cFormatDateTime = "YYYY-MM-DD hh:mm:ss", Optional ByVal cTypeQualifier = "")

' Параметры для сохраняемого файла
'    cFileName = "" ' имя файла экспорта, по умолчанию - имя активного листа
'    cDelimiter = "," ' разделитель полей
'    cTextQualifier = "" ' квалификатор символьных полей, по умолчанию экв. xlTextQualifierNone для совместимости с SQL
'    cDecimalSeparator = "." ' символ десятичной точки, по умолчанию экв. "dot" для совместимости
'    nStartRow = 1 ' Номер строки на листе - первая строка, с которой выпоняется экспорт (включая заголовок, если есть)
'    nStartCol = 1 ' Номер столбца на листе - первый столбец , с которого выполняется экспорт
'    vCutHeader = True ' Наличие строки заголовка (подписей столбцов) и его удаление:
'       =True=-1 - заголовок считается равным 1 строке, при этом из результирующего файла заголовок исключается
'       <0 - размер заголовка в строках, исключается из результата
'       >0 - размер заголовка в строках, не исключается из результата (но записывается "как есть", без преобразований)
'       =False=0 - заголовок отсутствует
'    cFormatdateTime = "YYYY-MM-DD hh:mm:ss" ' формат даты/времени, по умолчанию выставлен в ISO8601 для совместимости
'    cTypeQualifier = "#" ' квалификатор логических значений и даты, по умолчанию - пустаое значение
            
      Dim wb As Workbook, newwb As Workbook, sh As Worksheet, newsh As Worksheet
      Dim nLastRow As Long, nLastCol As Long, i As Long, j As Long
      Dim cOut As String, cValue
        
      Application.ScreenUpdating = False
        
      Set wb = ActiveWorkbook
      Set sh = ActiveSheet
      Set newwb = Workbooks.Add
      Set newsh = newwb.Sheets(1)
        
' Установки границ экспортируемой таблицы
' Правая-нижняя граница выставляется по используемой области листа
      nLastRow = sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
      nLastCol = sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1
' Левая-верхняя граница подтягивается к началу заполнения на листе
      nStartRow = Application.WorksheetFunction.Max(nStartRow, sh.UsedRange.Row)
      nStartCol = Application.WorksheetFunction.Max(nStartCol, sh.UsedRange.Column)
' ВНИМАНИЕ - заголовок будет отсчитан от нового левого-верхнего положения
' Анализ заголовка
      vCutHeader = vCutHeader + 0
      If vCutHeader < 0 Then nStartRow = nStartRow - vCutHeader
' Сборка данных
      For i = nStartRow To nLastRow
          vCutHeader = vCutHeader - 1
          cOut = ""
          For j = nStartCol To nLastCol
              cValue = sh.Cells(i, j)
              If vCutHeader < 0 Then ' не строка заголовка
                  Select Case VarType(cValue)
                  Case vbString
                      cValue = cTextQualifier & cValue & cTextQualifier
                  Case vbInteger, vbLong, vbByte
                      cValue = CStr(cValue)
                  Case vbSingle, vbDouble, vbCurrency, vbDecimal
                      cValue = Replace(CStr(cValue), Application.International(xlDecimalSeparator), cDecimalSeparator)
                  Case vbBoolean
                      cValue = cTypeQualifier & CStr(cValue) & cTypeQualifier
                  Case vbDate
                      cValue = cTypeQualifier & Format(cValue, cFormatDateTime) & cTypeQualifier
                  Case Else
                  ' Все значения ошибок
                      cValue = ""
                  End Select
              End If
              cOut = cOut & cDelimiter & CStr(cValue)
          Next
          newsh.Cells(i - nStartRow + 1, 1) = Mid(cOut, 2)
      Next
        
      Set newsh = Nothing
        
' Сохранение файла
      If Len(cFileName) = 0 Then cFileName = sh.Name & ".csv"
      If InStr(1, cFileName, "\") = 0 Then cFileName = wb.Path & "\" & cFileName
        
      Application.DisplayAlerts = False
      newwb.SaveAs FileName:=(cFileName), FileFormat:=xlTextPrinter, CreateBackup:=False, local:=True
      Application.DisplayAlerts = True
      newwb.Close savechanges:=False
' *
      Set newwb = Nothing
      wb.Activate
        
      Application.ScreenUpdating = True
        
      Set sh = Nothing
      Set wb = Nothing
        
End Sub
[/vba]

А также файл с примерами использования
К сообщению приложен файл: ExportSheet2CSV.xls (63.0 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010


Сообщение отредактировал AndreTM - Среда, 22.05.2013, 03:34
 
Ответить
СообщениеВ последнее время я уже пару раз наткнулся на то, что народу требуется экспортировать данные с листа в обычный текст с разделителями. При этом беглое изучение поисковиков привело к неутешительным выводам - ни один из стандартных форматов экспорта Excel не решает полностью проблему совместимости с "принимающей стороной". И если от проблем с представлением даты или логических значений, ошибок - ещё можно справиться предварительной обработкой листа, то "задвоение кавычек" нерешаемо (стандартными методами) в принципе...
Поэтому я, недолго думая, настрадал собственную процедуру для экспорта, которую и представляю.
[vba]
Код
Option Explicit

Sub ExportSheet2CSV(Optional ByVal cFileName = "", _
   Optional ByVal cDelimiter = ",", Optional ByVal cTextQualifier = "", Optional ByVal cDecimalSeparator = ".", _
   Optional ByVal nStartRow = 1, Optional ByVal nStartCol = 1, _
   Optional ByVal vCutHeader As Variant = True, _
   Optional ByVal cFormatDateTime = "YYYY-MM-DD hh:mm:ss", Optional ByVal cTypeQualifier = "")

' Параметры для сохраняемого файла
'    cFileName = "" ' имя файла экспорта, по умолчанию - имя активного листа
'    cDelimiter = "," ' разделитель полей
'    cTextQualifier = "" ' квалификатор символьных полей, по умолчанию экв. xlTextQualifierNone для совместимости с SQL
'    cDecimalSeparator = "." ' символ десятичной точки, по умолчанию экв. "dot" для совместимости
'    nStartRow = 1 ' Номер строки на листе - первая строка, с которой выпоняется экспорт (включая заголовок, если есть)
'    nStartCol = 1 ' Номер столбца на листе - первый столбец , с которого выполняется экспорт
'    vCutHeader = True ' Наличие строки заголовка (подписей столбцов) и его удаление:
'       =True=-1 - заголовок считается равным 1 строке, при этом из результирующего файла заголовок исключается
'       <0 - размер заголовка в строках, исключается из результата
'       >0 - размер заголовка в строках, не исключается из результата (но записывается "как есть", без преобразований)
'       =False=0 - заголовок отсутствует
'    cFormatdateTime = "YYYY-MM-DD hh:mm:ss" ' формат даты/времени, по умолчанию выставлен в ISO8601 для совместимости
'    cTypeQualifier = "#" ' квалификатор логических значений и даты, по умолчанию - пустаое значение
            
      Dim wb As Workbook, newwb As Workbook, sh As Worksheet, newsh As Worksheet
      Dim nLastRow As Long, nLastCol As Long, i As Long, j As Long
      Dim cOut As String, cValue
        
      Application.ScreenUpdating = False
        
      Set wb = ActiveWorkbook
      Set sh = ActiveSheet
      Set newwb = Workbooks.Add
      Set newsh = newwb.Sheets(1)
        
' Установки границ экспортируемой таблицы
' Правая-нижняя граница выставляется по используемой области листа
      nLastRow = sh.UsedRange.Row + sh.UsedRange.Rows.Count - 1
      nLastCol = sh.UsedRange.Column + sh.UsedRange.Columns.Count - 1
' Левая-верхняя граница подтягивается к началу заполнения на листе
      nStartRow = Application.WorksheetFunction.Max(nStartRow, sh.UsedRange.Row)
      nStartCol = Application.WorksheetFunction.Max(nStartCol, sh.UsedRange.Column)
' ВНИМАНИЕ - заголовок будет отсчитан от нового левого-верхнего положения
' Анализ заголовка
      vCutHeader = vCutHeader + 0
      If vCutHeader < 0 Then nStartRow = nStartRow - vCutHeader
' Сборка данных
      For i = nStartRow To nLastRow
          vCutHeader = vCutHeader - 1
          cOut = ""
          For j = nStartCol To nLastCol
              cValue = sh.Cells(i, j)
              If vCutHeader < 0 Then ' не строка заголовка
                  Select Case VarType(cValue)
                  Case vbString
                      cValue = cTextQualifier & cValue & cTextQualifier
                  Case vbInteger, vbLong, vbByte
                      cValue = CStr(cValue)
                  Case vbSingle, vbDouble, vbCurrency, vbDecimal
                      cValue = Replace(CStr(cValue), Application.International(xlDecimalSeparator), cDecimalSeparator)
                  Case vbBoolean
                      cValue = cTypeQualifier & CStr(cValue) & cTypeQualifier
                  Case vbDate
                      cValue = cTypeQualifier & Format(cValue, cFormatDateTime) & cTypeQualifier
                  Case Else
                  ' Все значения ошибок
                      cValue = ""
                  End Select
              End If
              cOut = cOut & cDelimiter & CStr(cValue)
          Next
          newsh.Cells(i - nStartRow + 1, 1) = Mid(cOut, 2)
      Next
        
      Set newsh = Nothing
        
' Сохранение файла
      If Len(cFileName) = 0 Then cFileName = sh.Name & ".csv"
      If InStr(1, cFileName, "\") = 0 Then cFileName = wb.Path & "\" & cFileName
        
      Application.DisplayAlerts = False
      newwb.SaveAs FileName:=(cFileName), FileFormat:=xlTextPrinter, CreateBackup:=False, local:=True
      Application.DisplayAlerts = True
      newwb.Close savechanges:=False
' *
      Set newwb = Nothing
      wb.Activate
        
      Application.ScreenUpdating = True
        
      Set sh = Nothing
      Set wb = Nothing
        
End Sub
[/vba]

А также файл с примерами использования

Автор - AndreTM
Дата добавления - 22.05.2013 в 03:32
AndreTM Дата: Среда, 29.05.2013, 19:02 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
В экспорте обнаружились проблемы... Строки длиной выше 255 символов, естественно, выводились коряво.
Так что я отказался от использования средств Excel'я вообще (в части записи выходного файла), и переписал код:
К сообщению приложен файл: 2877211.xls (50.5 Kb)


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
СообщениеВ экспорте обнаружились проблемы... Строки длиной выше 255 символов, естественно, выводились коряво.
Так что я отказался от использования средств Excel'я вообще (в части записи выходного файла), и переписал код:

Автор - AndreTM
Дата добавления - 29.05.2013 в 19:02
Staniiislav Дата: Среда, 17.07.2013, 09:44 | Сообщение № 3
Группа: Гости
Доброго времени суток всем
AndreTM, подскажите пожалуйста процедуру которая будет теперь обратно собирать данные в эксель
 
Ответить
СообщениеДоброго времени суток всем
AndreTM, подскажите пожалуйста процедуру которая будет теперь обратно собирать данные в эксель

Автор - Staniiislav
Дата добавления - 17.07.2013 в 09:44
AndreTM Дата: Среда, 17.07.2013, 10:08 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 501 ±
Замечаний: 0% ±

2003 & 2010
процедуру которая будет теперь обратно собирать данные в эксель
Ну, как бы сам Excel и будет собирать, если с его помощью просто открыть полученный файл... smile

С другой стороны, процедурка делалась для того, чтобы можно было покрутить форматы экспорта. Например, при обмене с SQL-серверами.


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
процедуру которая будет теперь обратно собирать данные в эксель
Ну, как бы сам Excel и будет собирать, если с его помощью просто открыть полученный файл... smile

С другой стороны, процедурка делалась для того, чтобы можно было покрутить форматы экспорта. Например, при обмене с SQL-серверами.

Автор - AndreTM
Дата добавления - 17.07.2013 в 10:08
Staniiislav Дата: Среда, 17.07.2013, 12:29 | Сообщение № 5
Группа: Гости
Понял, спасибо
 
Ответить
СообщениеПонял, спасибо

Автор - Staniiislav
Дата добавления - 17.07.2013 в 12:29
raf77 Дата: Среда, 23.04.2014, 17:20 | Сообщение № 6
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
AndreTM, нужна помощь в обработке ексель таблицы для перевода его в фаил блокнота
 
Ответить
СообщениеAndreTM, нужна помощь в обработке ексель таблицы для перевода его в фаил блокнота

Автор - raf77
Дата добавления - 23.04.2014 в 17:20
raf77 Дата: Среда, 23.04.2014, 17:20 | Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 2
Репутация: 0 ±
Замечаний: 0% ±

Excel 2003
напишите мне на адрес Удалено администрацией. Нарушение Правил форума
 
Ответить
Сообщениенапишите мне на адрес Удалено администрацией. Нарушение Правил форума

Автор - raf77
Дата добавления - 23.04.2014 в 17:20
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!