Comment Utiliser OleDb Pour Créer La Base De Données Excel

Ma tâche est de prendre une Base de données Access et créer un fichier Excel, mais je n'arrive pas a CRÉER le fichier Excel qui OleDb à utiliser.

Le fichier Excel nom sera fourni par l'Ingénieur de l'exécution de l'outil. Chaque Tableau de Données dans la Base de données Access va devenir une Feuille de calcul dans le fichier Excel.

Droit maintenant, j'ai un dévalent je ne peux pas obtenir au-dessus: Si le fichier n'existe pas, je ne peut pas le créer!

internal const string XL_FMT = "Provider=Microsoft.{0}.OLEDB.{1};Data Source={2};Mode=ReadWrite;Extended Properties=\"Excel {1};HDR={3};IMEX=1;\"";
internal DataTable tableNames;
internal OleDbConnection oleCon;
private string conStr;

public OleBase(string connectionString) {
  conStr = connectionString;
  //Using the debugger, conStr is:
  //"Provider=Microsoft.ACE.OLEDB.12.0;" +
  //"Data Source=C:\\Users\\cp-jpool\\Documents\\Ecat5.xlsx;" +
  //"Mode=ReadWrite;Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=1;\""
  object[] param = new object[] { null, null, null, "TABLE" };
  oleCon = new OleDbConnection(conStr);
  oleCon.Open();
  tableNames = oleCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, param);
}

Si le fichier n'existe PAS, à chaque fois que j'appelle Open() j'ai le OleDbException:

"La base de données Microsoft Access moteur n'a pas pu trouver l'objet "C:\Users\cp-jpool\Documents\Ecat5.xlsx'. Assurez-vous que l'objet existe et que vous épeler son nom et le nom de chemin d'accès correctement. Si 'C:\Users\cp-jpool\Documents\Ecat5.xlsx" n'est pas un objet local, vérifiez votre connexion réseau ou contactez l'administrateur du serveur."

Ainsi, le fichier n'existe pas, hein? Eh bien, j'ai essayé de créer en modifiant mon CTor() être:

public OleBase(string connectionString) {
  conStr = connectionString;
  object[] param = new object[] { null, null, null, "TABLE" };
  oleCon = new OleDbConnection(conStr);
  if (-1 < conStr.IndexOf(";IMEX=1;")) {
    string dsString = "Data Source=";
    int dsIndex = conStr.IndexOf(dsString);
    string conSub = conStr.Substring(dsIndex + dsString.Length);
    int firstCol = conSub.IndexOf(';');
    string xlPath = conSub.Substring(0, firstCol);
    if (!File.Exists(xlPath)) {
      File.Create(xlPath);
    }
  }
  oleCon.Open();
  tableNames = oleCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, param);
}

Maintenant, chaque fois que ce code tente d'appeler le Open() méthode de l'objet OleDbConnection, j'obtiens ce différent OleDbException:

"La base de données Microsoft Access moteur ne peut pas ouvrir ou écrire dans le fichier ". Il est déjà ouvert en mode exclusif par un autre utilisateur, ou vous devez avoir l'autorisation de consulter et d'écrire ses données."

J'ai même essayé de créer le fichier Excel à l'aide d'un StreamWriter de le remplir avec de base des en-têtes:

public OleBase(string connectionString) {
conStr = connectionString;
object[] param = new object[] { null, null, null, "TABLE" };
oleCon = new OleDbConnection(conStr);
if (-1 < conStr.IndexOf(";IMEX=1;")) {
string dsString = "Data Source=";
int dsIndex = conStr.IndexOf(dsString);
string conSub = conStr.Substring(dsIndex + dsString.Length);
int firstCol = conSub.IndexOf(';');
string xlPath = conSub.Substring(0, firstCol);
using (StreamWriter xls = new StreamWriter(xlPath, false, Encoding.UTF8)) {
xls.WriteLine("<?xml version=\"1.0\"?><?mso-application progid=\"Excel.Sheet\"?>");
xls.WriteLine("<ss:Workbook xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" ");
xls.WriteLine("xmlns:o=\"urn:schemas-microsoft-com:office:office\" ");
xls.WriteLine("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" ");
xls.WriteLine("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\">");
xls.WriteLine("<ss:Styles>");
xls.WriteLine("<ss:Style ss:ID=\"Default\" ss:Name=\"Normal\"><ss:Alignment ss:Vertical=\"Bottom\"/><ss:Borders/><ss:Font/><ss:Interior/><ss:NumberFormat/><ss:Protection/></ss:Style>");
xls.WriteLine("<ss:Style ss:ID=\"BoldColumn\"><ss:Font x:Family=\"Swiss\" ss:Bold=\"1\"/></ss:Style>");
xls.WriteLine("<ss:Style ss:ID=\"StringLiteral\"><ss:NumberFormat ss:Format=\"@\"/></ss:Style>");
xls.WriteLine("<ss:Style ss:ID=\"Decimal\"><ss:NumberFormat ss:Format=\"0.0000\"/></ss:Style>");
xls.WriteLine("<ss:Style ss:ID=\"Integer\"><ss:NumberFormat ss:Format=\"0\"/></ss:Style>");
xls.WriteLine("<ss:Style ss:ID=\"DateLiteral\"><ss:NumberFormat ss:Format=\"mm/dd/yyyy;@\"/></ss:Style>");
xls.WriteLine("</ss:Styles>");
xls.WriteLine("</ss:Workbook>");
xls.Flush();
xls.Close();
}
}
oleCon.Open();
tableNames = oleCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, param);
}

Ce code généré encore un autre OleDbException message:

"Table externe n'est pas dans le format attendu."

Que je peux voir, OleDbConnection ne dispose pas d'une méthode de création du fichier, alors comment puis-je CRÉER ce fichier Excel afin que je puisse l'utiliser?

  • Si vous acceptez de prendre une autre route, il est EPPlus
InformationsquelleAutor jp2code | 2012-05-17