C# 在C中使用OLEDB读取受密码保护的excel文件#
在我的c#应用程序中,我使用的是OLEDB连接字符串“C# 在C中使用OLEDB读取受密码保护的excel文件#,c#,excel,oledb,C#,Excel,Oledb,在我的c#应用程序中,我使用的是OLEDB连接字符串“Provider=Microsoft.Jet.OLEDB.4.0;数据源=c:\test.xls;扩展属性=\”Excel 8.0;HDR=否;只读=真;IMEX=1 \“”读取Excel文件。 为了读取受密码保护的文件,我尝试在连接字符串中添加密码字段,但无法读取该文件。 我想知道,如果我事先知道密码,是否有任何方法可以使用OLEDB读取受密码保护的Excel文件。这里有,包括OLEDB。因此,您无法使用标准方法打开受密码保护的文件。你必须
Provider=Microsoft.Jet.OLEDB.4.0;数据源=c:\test.xls;扩展属性=\”Excel 8.0;HDR=否;只读=真;IMEX=1 \“
”读取Excel文件。
为了读取受密码保护的文件,我尝试在连接字符串中添加密码字段,但无法读取该文件。
我想知道,如果我事先知道密码,是否有任何方法可以使用OLEDB读取受密码保护的Excel文件。这里有,包括OLEDB。因此,您无法使用标准方法打开受密码保护的文件。你必须使用变通方法
如果Excel工作簿受
密码,您无法为其打开
数据访问,即使通过提供
请在连接中更正密码
一串如果您尝试,您将收到
以下错误消息:“无法
解密文件
,虽然不是用C#,但您可以根据自己的目的轻松地进行调整
如果您自己不知道密码,另一种方法是在没有密码的情况下重新写入文件。您可以使用并向其中添加以下例程:
public void SaveFile()
{
this.excelWorkbook.SaveAs(
this.excelWorkbook.FullName,
vk_format,
"",
vk_write_res_password,
vk_read_only,
null,
Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
null,
vk_add_to_mru,
null,null,vk_local);
}
.您可以使用访问Office 2007加密文件。开源,包括修改的Excel软件包
示例代码:
using (OfficeCryptoStream stream = OfficeCryptoStream.Open("a.xlsx", "password"))
{
// Do stuff (e.g. create System.IO.Packaging.Package or
// ExcelPackage from the stream, make changes and save)
// Change the password (optional)
stream.Password = "newPassword";
// Encrypt and save the file
stream.Save();
}
如果使用查询来读取excel文件,则某些工作表是否受保护无关紧要:这两种方式都可以
private string ExcelConnection(string fileName)
{
return
@"Provider=Microsoft.Jet.OLEDB.4.0;" +
@"Data Source=" + fileName + ";" +
@"Extended Properties=" + Convert.ToChar(34).ToString() +
@"Excel 8.0" + Convert.ToChar(34).ToString() + ";";
}
private DataTable readExcel(string fileName, string sql)
{
OleDbConnection conn = new OleDbConnection(ExcelConnection(fileName));
OleDbCommand cmd = new OleDbCommand(sql, conn);
OleDbDataAdapter adp = new OleDbDataAdapter();
adp.SelectCommand = cmd;
DataTable dt = new DataTable();
try
{
adp.FillSchema(dt, SchemaType.Source);
adp.Fill(dt);
}
catch
{
}
return dt;
}
经过一次又一次的研究,我终于发现了两件事。
1.使用OLEDB无法读取受密码保护的excel文件。
2.即使Interop可以读取excel文件,无论是否受密码保护,其性能也不如OLEDB。
因此,我通过组合
1.OLEDB,性能非常好,
2.可以读取每个excel文件的互操作。
public DataTable ReadPasswordProtectedExcel(string ExcelFilePath, string Password)
{
String TempExcelFilePath = string.Empty;
DataTable _DataTable = new DataTable();
#region Get ExcelFile and Remove Password
{
String TempExcelFileName = string.Empty;
String DirectoryPath = string.Empty;
Microsoft.Office.Interop.Excel.Application excelapp = new Microsoft.Office.Interop.Excel.Application();
excelapp.Visible = false;
Microsoft.Office.Interop.Excel.Workbook newWorkbook = excelapp.Workbooks.Open(ExcelFilePath, 0,
true, 5, Password, "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true,
false, 0, true, false, false);
TempExcelFileName = string.Format("{0}_{1}", "__", Path.GetFileName(ExcelFilePath)); // __xxx.xlsx
TempExcelFilePath = String.Format("{0}/{1}", Path.GetDirectoryName(ExcelFilePath), TempExcelFileName);
/// Create new excel file and remove password.
newWorkbook.SaveAs(TempExcelFilePath, Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookDefault, "", "",
false, false, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
newWorkbook.Close(true, "", false);
excelapp.Quit();
Marshal.ReleaseComObject(excelapp);
}
#endregion
#region Get data from excel file by using OLEDB
{
_DataTable = ReadExcelFileInOLEDB(TempExcelFilePath);
///Delete excel file
File.Delete(TempExcelFilePath);
}
#endregion
return _DataTable;
}
public DataTable ReadExcelFileInOLEDB(string _ExcelFilePath)
{
string ConnectionString = string.Empty;
string SheetName = string.Empty;
DataTable _DataTable = null;
DataSet _DataSet = null;
try
{
ConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 12.0;HDR=YES;IMEX=0;'", _ExcelFilePath);
using (OleDbConnection _OleDbConnection = new OleDbConnection(ConnectionString))
{
_OleDbConnection.Open();
_DataTable = _OleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
if (_DataTable == null)
return null;
SheetName = _DataTable.Rows[0]["TABLE_NAME"].ToString();
ConnectionString = string.Format("SELECT * FROM [{0}]", SheetName);
using (OleDbCommand _OleDbCommand = new OleDbCommand(ConnectionString, _OleDbConnection))
{
using (OleDbDataAdapter _OleDbDataAdapter = new OleDbDataAdapter())
{
_OleDbDataAdapter.SelectCommand = _OleDbCommand;
_DataSet = new DataSet();
_OleDbDataAdapter.Fill(_DataSet, "PrintInfo");
return _DataSet.Tables["PrintInfo"];
}
}
}
}
catch (Exception ex)
{
throw ex;
}
}
最后,如果您想在从excel检索数据时删除空行,请检查下面的代码
SELECT * FROM NAMED_RANGE WHERE [YourColumnTitle] IS NOT NULL
如果文件是加密的,那么它是否适用?