J'ai une exigence pour convertir les fichiers Excel (2010) en CSV. Actuellement, j'utilise Excel Interop pour ouvrir et SaveAs csv, qui fonctionne bien. Cependant, l'Interop a quelques problèmes dans l'environnement où nous l'utilisons, donc je suis à la recherche d'une autre solution.Comment convertir Excel en CSV en utilisant OpenXML SDK?
J'ai trouvé le moyen de travailler avec des fichiers Excel sans interopérer est d'utiliser le SDK OpenXML. J'ai rassemblé du code pour parcourir toutes les cellules de chaque feuille et les écrit simplement dans un autre fichier au format CSV.
Un problème que j'ai est la manipulation des rangées vides et des cellules. Il semble que, avec ce code, les lignes vierges et les cellules sont complètement inexistantes, donc je n'ai aucun moyen de les connaître. Y a-t-il des traces à travers toutes les rangées et toutes les cellules, y compris les blancs?
string filename = @"D:\test.xlsx";
string outputDir = Path.GetDirectoryName(filename);
//--------------------------------------------------------
using (SpreadsheetDocument document = SpreadsheetDocument.Open(filename, false))
{
foreach (Sheet sheet in document.WorkbookPart.Workbook.Descendants<Sheet>())
{
WorksheetPart worksheetPart = (WorksheetPart) document.WorkbookPart.GetPartById(sheet.Id);
Worksheet worksheet = worksheetPart.Worksheet;
SharedStringTablePart shareStringPart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringItem[] items = shareStringPart.SharedStringTable.Elements<SharedStringItem>().ToArray();
// Create a new filename and save this file out.
if (string.IsNullOrWhiteSpace(outputDir))
outputDir = Path.GetDirectoryName(filename);
string newFilename = string.Format("{0}_{1}.csv", Path.GetFileNameWithoutExtension(filename), sheet.Name);
newFilename = Path.Combine(outputDir, newFilename);
using (var outputFile = File.CreateText(newFilename))
{
foreach (var row in worksheet.Descendants<Row>())
{
StringBuilder sb = new StringBuilder();
foreach (Cell cell in row)
{
string value = string.Empty;
if (cell.CellValue != null)
{
// If the content of the first cell is stored as a shared string, get the text
// from the SharedStringTablePart. Otherwise, use the string value of the cell.
if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
value = items[int.Parse(cell.CellValue.Text)].InnerText;
else
value = cell.CellValue.Text;
}
// to be safe, always use double quotes.
sb.Append(string.Format("\"{0}\",", value.Trim()));
}
outputFile.WriteLine(sb.ToString().TrimEnd(','));
}
}
}
}
Si j'ai les données de fichier Excel suivant:
one,two,three
,,
last,,row
Je vais obtenir le CSV suivant (ce qui est faux):
one,two,three
last,row
ne pas le OleDbConnection exigent que Excel est installé? L'avantage d'Open XML SDK est qu'Excel n'est pas requis. –
Non, pas nécessaire. Il traitera le fichier comme un magasin de données binaires, ce qui est le cas. Je finis par faire cela tous les deux ou trois ans, pour une raison quelconque :). –
Je devrais également noter que je fais beaucoup de travail OpenXml ... ce serait un cas d'utilisation d'un nuke pour tuer un moustique. –