Pesquisar este blog

quarta-feira, 17 de junho de 2015

Remover senha de planilha Excel

Recentemente recebi a tarefa de dar manutenção em uma página responsável pelo upload de planilhas Excel. A funcionalidade básica (upload de arquivos) funcionava perfeitamente. 
Entretanto, devido a confidencialidade das informações a serem armazenadas, a partir daquele momento, as mesmas seriam enviadas protegidas por senha. A aplicação anteriormente, utilizava o ClosedXML para efetuar a leitura e manipulação da planilha. Mas, esta API não possuía em sua documentação um método capaz de ler uma planilha criptografada (protegida por senha).
Na internet existem inúmeras APIs não gratuitas capazes de decriptar/remover senhas de planilhas, porém preferi recorrer a uma API "quase nativa" em ambientes corporativos. A solução foi apelar para o bom e velho Office.
Ao instalar o Office na máquina, o instalador registra as dlls do mesmo, podendo estas serem importadas e utilizadas no Visual Studio para automatizar operações em documentos.
Então, em busca de uma solução de menor impacto no algoritmo de importação já existente utilizado pela aplicação, codifiquei o seguinte protótipo, responsável por criar uma cópia do documento importado sem a senha, para que assim, o documento criptografado seja armazenado e o sistema efetue a leitura a partir de uma cópia descriptografada.
using Microsoft.Office.Interop.Excel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace Excel.PasswordRemover
{
    class Program
    {
        static void Main(string[] args)
        {
            string password = "12345";

            //Crio as variáveis com os tipos usando pelo Excel
            Application excel = null;
            Workbooks workbooks = null;
            Workbook workbook = null;

            try
            {
                //Inicio uma instância do Excel
                excel = new Application();

                //Inicio os workbooks
                workbooks = excel.Workbooks;

                //Abro o arquivo passando a senha entre os parâmetros
                workbook = workbooks.Open(@"C:\Users\bruno\Desktop\plan1.xlsx"
                , Type.Missing, Type.Missing, Type.Missing, password, password, Type.Missing
                , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing
                , Type.Missing);
                //Desprotejo o documento
                workbook.Unprotect(password);

                //Limpo as senhas
                workbook.Password = string.Empty;
                workbook.WritePassword = string.Empty;

                //Salvo uma "cópia" do arquivo sem a senha
                workbook.SaveAs(@"C:\Users\bruno\Desktop\plan1_no_password.xlsx"
                , Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing
                , Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlShared, Type.Missing
                , Type.Missing, Type.Missing, Type.Missing, Type.Missing);

                workbook.Close();

                excel.Quit();
            }
            catch (Exception)
            {
                //TODO: Tratar Exceptions
            }
            finally
            {
                //Garanto a finalização da instância do Excel
                Marshal.ReleaseComObject(workbook);
                Marshal.ReleaseComObject(workbooks);
                Marshal.ReleaseComObject(excel);
            }
        }
    }
}


Nenhum comentário:

Postar um comentário