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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.05.2015, 09:43   #1
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию Удаление защиты с листов и книги в Excel

Здравствуйте!

На форуме вроде нельзя обсуждать варез(взлом, кряки и прочие штуки)

Но когда я озадачился вопросом удалением защиты с файлов Excel (MS Office 2010) оказалось что этот способ не является варезом, т.к. Либре офис автоматически удаляет защиты, также действует и офис на iPhone.

ссылка на exe

Поэтому я и решил запостить решение на форуме
Решение на Delphi
Код:
var {глобальные}
  TempPath: string = '';
  ZipFile: string = '';

const
  BookProtect = '<workbookProtection';
  SheetProtect = '<sheetProtection';
  TagProtect = '/>';

implementation

uses System.Zip, System.IOUtils, StrUtils;

{$R *.fmx}

function Parse(const tag1, tag2, source: string): string;
var
  p, p2: Integer;
begin
  Result := '';
  p := StrUtils.PosEx(tag1, source);

  p2 := StrUtils.PosEx(tag2, source, p + tag1.Length + 1);
  if (p = 0) or (p2 = 0) then
    exit;
  if p2 > p then
    Result := (Copy(source, p + tag1.Length, p2 - p - tag1.Length));
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  I: Integer;
  Zip: TZipFile;
  aXML: TStringList;
  Files: TStringDynArray;
  FoundStr, InsidePath: string;
begin
  if OpenDialog1.Execute then
  begin
    Memo1.Lines.Clear;
    ZipFile := OpenDialog1.FileName;
    if Pos('.xlsx', ZipFile) > 0 then
    begin
      TempPath := IncludeTrailingPathDelimiter(TPath.GetTempPath + 'exzip-' +
        FormatDateTime('dd-mm-yy_hh-mm-ss', now));

      Zip := TZipFile.Create;
      try
        Zip.UTF8Support := true;
        if Zip.IsValid(ZipFile) then
        begin
          Memo1.Lines.Add('[Valid]: "' + ZipFile + '"');
          TDirectory.CreateDirectory(TempPath);
          if TDirectory.Exists(TempPath) then
          begin
            Zip.ExtractZipFile(ZipFile, TempPath);
            Memo1.Lines.Add('[TempDir]: Extracted');
            InsidePath := TempPath + IncludeTrailingPathDelimiter('xl');
            aXML := TStringList.Create;
            try
              // workbook
              aXML.LoadFromFile(InsidePath + 'workbook.xml', TEncoding.UTF8);
              if Pos(BookProtect, aXML.Text) > 0 then
              // нашли защиту книги
              begin
                FoundStr := BookProtect + Parse(BookProtect, TagProtect, aXML.Text) +
                  TagProtect;
                aXML.Text := StringReplace(aXML.Text, FoundStr, '',
                  [rfReplaceAll, rfIgnoreCase]);
                aXML.SaveToFile(InsidePath + 'workbook.xml', TEncoding.UTF8);
                Memo1.Lines.Add('[WorkBook]: delete protect');
              end;

              // sheets
              InsidePath := InsidePath + IncludeTrailingPathDelimiter('worksheets');
              Files := TDirectory.GetFiles(InsidePath);

              for I := Low(Files) to High(Files) do
              begin
                aXML.Clear;
                aXML.LoadFromFile(Files[I], TEncoding.UTF8);
                if Pos(SheetProtect, aXML.Text) > 0 then
                // нашли защиту листа
                begin
                  FoundStr := SheetProtect + Parse(SheetProtect, TagProtect, aXML.Text) +
                    TagProtect;
                  aXML.Text := StringReplace(aXML.Text, FoundStr, '',
                    [rfReplaceAll, rfIgnoreCase]);
                  aXML.SaveToFile(Files[I], TEncoding.UTF8);
                  Memo1.Lines.Add('[WorkSheet]: delete protect');
                end;
              end;
            finally
              FreeAndNil(aXML);
            end;
            Memo1.Lines.Add('DONE!');
          end;
          InsidePath := IncludeTrailingPathDelimiter(TPath.GetDocumentsPath) +
            ExtractFileName(ZipFile);
          // собираем обратно в файл
          Zip.ZipDirectoryContents(InsidePath, TempPath, TZipCompression.zcDeflate);
          // подчищаем за собой
          TDirectory.Delete(TempPath, true);
          Memo1.Lines.Add('[TempDir]: deleted');
          Memo1.Lines.Add('[Saved]: "' + InsidePath + '"');
        end;
      finally
        FreeAndNil(Zip);
      end;
    end
    else
      ShowMessage('Неправильное расширение файла!' + #13#10 + 'только .XLSX' + #13#10 +
        'тестировался с Microsoft Office 2010');
  end;
end;
ZuBy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление лишних листов в Excel Rompler Общие вопросы Delphi 5 04.05.2015 19:24
выпадающий список листов книги Excel sharik.kiev.ua Microsoft Office Excel 1 26.05.2013 22:48
htmlspecialchars сгодится для защиты гостевой книги? Valio PHP 1 15.01.2011 09:59
Перебор листов книги VistaSV30 Microsoft Office Excel 2 16.03.2010 14:43
Снятие Защиты с листов, сразу со всех valerij Microsoft Office Excel 2 02.11.2007 21:19