manipolare i dati prima di importare da Excel a set di dati
-
27-09-2019 - |
Domanda
Ho un paio di colonne di dati in un foglio di Excel, che devo importare alla mia richiesta.
I farlo usando -
string strConn;
OleDbDataAdapter oledaExcelInfo;
strConn = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source = " + Server.MapPath(strSavePath + strRepFileName) + ";Extended Properties=\"Excel 8.0;HDR=NO;IMEX=1\"";
oledaExcelInfo = new OleDbDataAdapter("SELECT * FROM [Book1]", strConn);
dsetExcelInfo = new DataSet();
oledaExcelInfo.Fill(dsetExcelInfo, "CCInfo");
Mentre questi dati importa con successo, a volte i dati vengono importati in modo non corretto vale a dire di un numero di 1234567
potevano essere importati come 1.23E+06
Questo può essere risolto se i dati nel file di Excel è '1234567
invece di 1234567
(aggiungere le virgolette singole)
Ora sto cercando di manipolare i dati che vado a prendere dalla Excel in modo che prima di importare i dati di programmazione che posso aggiungere una '
a tutti i valori per impedire l'importazione non corretta.
Ho anche provato ad utilizzare OleDbDataAdapter.Update ma credo che questo non sarà di aiuto come questo accade dopo che la tecnica è importata. E 'corretto?
Posso manipolare dati in modo che ho importare i dati corretti? Come posso farlo?
Soluzione
ho usato l'open source NPOI libreria per importare dati da Excel e preservare il formato dei dati come esso sia in foglio spread cioè 1234567
sarebbero importati come 1234567
invece di importare dati in un formato differente come 1.23E+06
Invece di importare i dati come indicato nella domanda di cui sopra, ho importare dati utilizzando biblioteca NPOI -
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
HSSFWorkbook hssfworkbook;
using (FileStream file = new FileStream(Server.MapPath(strSavePath + strRepFileName), FileMode.Open, FileAccess.Read))
{
hssfworkbook = new HSSFWorkbook(file);
}
Sheet sheet = hssfworkbook.GetSheet("Book1");
DataTable dt = new DataTable(); //Create datatable
dt.Columns.Add(); //Add data columns
for (int count = 0; count <= sheet.LastRowNum; count++)
{
DataRow dr = dt.NewRow(); //Create new data row
//Based on the type of data being imported - get cell value accordingly
dr[0] = sheet.GetRow(count).GetCell(0).StringCellValue;
//dr[0] = sheet.GetRow(count).GetCell(0).NumericCellValue;
//dr[0] = sheet.GetRow(count).GetCell(0).RichStringCellValue;
//dr[0] = sheet.GetRow(count).GetCell(0).DateCellValue;
//dr[0] = sheet.GetRow(count).GetCell(0).BooleanCellValue;
dt.Rows.Add(dr); //Add row to datatable
}
Altri suggerimenti
Ho appena ricevuto un problema simile (si trova qui: Quirky SELECT da file di Excel tramite il metodo OleDbDataAdapter (C #) ).
Prova con la seguente stringa di connessione, se si desidera utilizzare solo framework .NET senza librerie esterne:
string connString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\MyExcel.xls;Extended Properties=""Excel 8.0;HDR=No;IMEX=1"";";
Arrestare il motore da JET per ACE ha fatto per me.