Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 15.07.2015, 13:23   #1
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию TStringlist.SaveToFile без спец символов

как сохранить без 3х спец символов в начале файла? коды символов (EF BB BF)
memo1.Lines.SaveToFile('1.xls', TEncoding.UTF8);
дельфи xe5

на эти символы ругается либероофис при открытии файла. хотя ексель открывает их нормально. если символы удалить из файла потом руками то файл открывается хорошо.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума
Старый 15.07.2015, 14:13   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Через TStringStream? Где-то читал, что его SaveToFile без маркера пишет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 15.07.2015, 14:24   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

кстати, а если содержимое TStringList сохранить в поток(Stream), а потом этот Stream записать в файл, маркеры будут?

Если да, то, имхо, поток можно записать не от начала, а сдвинув позицию на три байта...
Serge_Bliznykov вне форума
Старый 15.07.2015, 14:26   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
1.xls
Опа... А как ты в этот формат запихнул простой текст из мемо?
Всмысле на что расчет?
I'm learning to live...
Stilet вне форума
Старый 15.07.2015, 14:59   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Та тож наверно csv c таким расширением
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума
Старый 15.07.2015, 15:01   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Опа... А как ты в этот формат запихнул простой текст из мемо?
Всмысле на что расчет?
О! Точно! XLS!!!! Из мемо!!

я слона то и проглядел!!!
Serge_Bliznykov вне форума
Старый 15.07.2015, 15:07   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
О! Точно! XLS!!!! Из мемо!!
... из Мемо, Карл! МЕМО!!!!
I'm learning to live...
Stilet вне форума
Старый 15.07.2015, 16:41   #8
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

на самом деле там структура xml. но если дать разрешение xml, то на компах без мс офиса открывает интернет експлоером и что бы не парится с настройкой компов на правильный формат дал расширение xls, которое по умолчанию открывает либероофис.

неплохо вы обосрали тему, но решение как оказалось простое, хотя видимо никто и не пытался поглядеть как на самом деле сохраняет весь класс TStrings.

memo1.Lines.WriteBOM:=false;
это свойство и отвечает за начальные кривые символы (преамбула) при ЛЮБОМ сохранении.
следовательно на добыло лишь чуток код подправить.
Код:
memo1.Lines.WriteBOM:=false;
memo1.Lines.SaveToFile('1.xls', TEncoding.UTF8);
из класса tstrings:
Код:
procedure TStrings.SaveToFile(const FileName: string; Encoding: TEncoding);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(Stream, Encoding);
  finally
    Stream.Free;
  end;
end;
procedure TStrings.SaveToStream(Stream: TStream; Encoding: TEncoding);
var
  Buffer, Preamble: TBytes;
begin
  if Encoding = nil then
    Encoding := FDefaultEncoding;
  Buffer := Encoding.GetBytes(GetTextStr);
  if FWriteBOM then
  begin
    Preamble := Encoding.GetPreamble;
    if Length(Preamble) > 0 then
      Stream.WriteBuffer(Preamble, Length(Preamble));
  end;
  Stream.WriteBuffer(Buffer, Length(Buffer));
end;
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума
Старый 15.07.2015, 16:45   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
на самом деле там структура xml.
Где? В документе XLS? покажи скриншотом пожалуйста где ты там такое видел. Именно стандартный XLS, а не его ответвления. Я хочу увидеть.
I'm learning to live...
Stilet вне форума
Старый 15.07.2015, 16:53   #10
IliaIT
Форумчанин
 
Аватар для IliaIT
 
Регистрация: 17.03.2009
Сообщений: 977
По умолчанию

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

Код:
<?xml version="1.0"?>
<?mso-application 
progid="Excel.Sheet"?>
<Workbook xmlns="urn:schemas-
microsoft-com:office:spreadsheet"
 xmlns:o="urn:schemas-microsoft-
com:office:office"
 xmlns:x="urn:schemas-microsoft-
com:office:excel"
 xmlns:ss="urn:schemas-
microsoft-com:office:spreadsheet"
 
xmlns:html="http://www.w3.org/T
R/REC-html40">
<Styles>
<Style ss:ID="Default" 
ss:Name="Normal">
 <Alignment ss:Vertical="Bottom"/>
 <Borders/>
<Font ss:FontName="Arial Cyr" 
x:CharSet="204"/></Style>
<Style 
ss:ID="s21"><NumberFormat 
ss:Format="dd/mm/yy\ 
hh:mm"/></Style>
<Style ss:ID="s22">
 <Font ss:FontName="Arial Cyr" 
x:CharSet="204" ss:Bold="1"/>
</Style></Styles>
<Worksheet ss:Name="Лист 1">
  <Table 
ss:ExpandedColumnCount="5" 
x:FullRows="1">
   <Column ss:Width="140"/>
  <Row ss:StyleID="s22">
   <Cell><Data 
ss:Type="String">Дружбы, 
2_Рє1</Data></Cell>
   <Cell><Data 
ss:Type="String">верхние 
этажи</Data></Cell>
   <Cell><Data 
ss:Type="Number">703</Data></
Cell>
   <Cell><Data 
ss:Type="String"></Data></Cell>
  </Row>
  <Row ss:Index="3" 
ss:StyleID="s22">
   <Cell><Data 
ss:Type="String">Дата</Data></
Cell>
   <Cell><Data 
ss:Type="String">m3</Data></Ce
ll>
  </Row>
   <Row ss:Index="5">
    <Cell ss:StyleID="s21"><Data 
ss:Type="DateTime">2015-07-
13T13:10</Data></Cell>
    <Cell><Data 
ss:Type="Number">23</Data></C
ell>
   </Row>
  </Table>
  <WorksheetOptions 
xmlns="urn:schemas-microsoft-
com:office:excel">
  
<Selected/><Panes><Pane><Nu
mber>3</Number></Pane></Pan
es>
</WorksheetOptions></Worksheet
></Workbook>
к этому содержимому по умолчанию при сохранении добавлялось 3 байта которые я не просил, как потом оказалось не отказался от них принудительно.
Интуитивно понятный интерфейс - это такой интерфейс, для работы с которым нужна недюжинная интуиция.
IliaIT вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
замена спец символов propoker23 Общие вопросы Delphi 5 24.03.2012 22:39
Определение спец.символов в DBF базе Gulik БД в Delphi 4 25.04.2011 13:29
TstringList-смещение на 5 символов kokj007 Общие вопросы Delphi 2 30.01.2011 00:48
Вывод спец. символов в строку. Delphi Horus92 Помощь студентам 2 27.08.2010 08:54
TStringList Замена символа на ряд символов. Alex Cones Общие вопросы Delphi 17 23.03.2010 20:00