giovedì 29 gennaio 2015
LINQ to Entities does not recognize the method System.String PadRight(Int32, Char) and this method cannot be translated into a store expression LINQ to Entities non riconosce il metodo 'System.String PadRight(Int32, Char)', che pertanto non può essere convertito in un'espressione di archivio
Nel caso che si esegue un metodo, per esempio il metodo Padright di un oggetto di tipo string, durante l'esecuzione della query genera un errore come indicato dal titolo del post.
Qui di seguito la query che genera l'errore.
string spazio = "";
var risultato = (from Dati in Oggetti()
where Dati.Campo == "1"
select new
{
PrimoCampo= "1",
SecondoCampo = (string.IsNullOrEmpty(Dati.CAmpoA) == true ? spazio .PadRight(10, ' ') : Dati.CAmpoA)
}
Per risolvere tale problema, dobbiamo utilizare la select nel methodo ToList utilizzato nell'espressione della query, che restituisca un insieme di tipo tolist.
Qui di seguito si riporta l'esempio di query Linq per risolvere tale errore.
string spazio = "";
Qui di seguito un esempio di codice
var risultato= (from Dati in Oggetti()
where Dati.Campo == "1"
select Dati).ToList().Select(c => new {
PrimoCampo= "1",
SecondoCampo = (string.IsNullOrEmpty(c.CAmpoA) == true ? spazio .PadRight(10, ' ').ToString() : c.CAmpoA)
}).ToList();
martedì 27 gennaio 2015
.Net C# decomprimere file tar e gz tramite libreria tar-cs
Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_decomprimere-file-di-tipo-tar-e-gz-trami_1372.aspx
In questo articolo vedremo come utilizzare la libreria Tar-Cs per decomprimere file compressi tramite il linguaggio di programmazione C#.
Prima di creare il progetto, bisogna scaricare la libreria gratuita, qui https://code.google.com/p/tar-cs/ è possibile scaricare il sorgente ed il componente.
Stesura del codice
Utilizzeremo un progetto di tipo Windows Application, per scoprire come utilizzare questo componente.
Dopo aver creato un progetto di tipo Windows Application, inseriamo un pulsante nella Windows Form, in questo modo al click del pulsante verrà eseguita l’operazione di estrazione file.
Passiamo in visualizzazione codice ed in particolare nell’evento “Click” del pulsante, dobbiamo scrivere il codice che permette di decomprimere il file.
Nell'evento verrà richiamata una funzione, che gli viene passata la cartella nella quale si trovano i file compressi.
Qui di seguito si riporta il frammento di codice delle suddette operazioni.
Il codice precedente è molto semplice, richiama una funzione (DecomprimiFileCompresso) in uno specifico percorso.
la funzione riportata qui di seguito, cerca tutti quei compressi di tipo .gz.
A sua volta verrà richiamata una funzione che permette di decomprimere tali file.
Qui di seguito si riporta il codice di tale operazioni.
La funzione “DecomprimiFileCompresso” esegue una ricerca nella cartella che viene passata ed estrapola tutti i file .tar contenuti nel vari file di tipo “gz”.
A questo punto viene eseguita una funziona per estrapolare tutti i file di tipo gz e poi successivamente tutti i file di tipo “Tar”.
Qui di seguito sono riportati tali funzioni.
La funzione “DecomprimiFileTar”, estrae solo quei file che contengono il nome di tipo “MioFile” e che hanno una dimensione superiore ai 3 kb. Questa gestione dei file avviene tramite la classe "TarReader" che permette la gestione dei file compressi.
Conclusioni
L’articolo ha voluto illustrare le potenzialità di questo componente, che può tornare utile anche in quei contesti con sistemi diversi.
Tramite la parola “Download” potete scaricare il progetto di esempio di questo articolo.
In questo articolo vedremo come utilizzare la libreria Tar-Cs per decomprimere file compressi tramite il linguaggio di programmazione C#.
Prima di creare il progetto, bisogna scaricare la libreria gratuita, qui https://code.google.com/p/tar-cs/ è possibile scaricare il sorgente ed il componente.
Stesura del codice
Utilizzeremo un progetto di tipo Windows Application, per scoprire come utilizzare questo componente.
Dopo aver creato un progetto di tipo Windows Application, inseriamo un pulsante nella Windows Form, in questo modo al click del pulsante verrà eseguita l’operazione di estrazione file.
Passiamo in visualizzazione codice ed in particolare nell’evento “Click” del pulsante, dobbiamo scrivere il codice che permette di decomprimere il file.
Nell'evento verrà richiamata una funzione, che gli viene passata la cartella nella quale si trovano i file compressi.
Qui di seguito si riporta il frammento di codice delle suddette operazioni.
private void BtnEstrai_Click(object
sender, EventArgs e)
{
if
(DecomprimiFileCompresso(@"C:\CartellaFile\")
== true)
{
MessageBox.Show("File estratti con successo.");
}
else
{
MessageBox.Show("Impossibile estrare i file");
}
Il codice precedente è molto semplice, richiama una funzione (DecomprimiFileCompresso) in uno specifico percorso.
la funzione riportata qui di seguito, cerca tutti quei compressi di tipo .gz.
A sua volta verrà richiamata una funzione che permette di decomprimere tali file.
Qui di seguito si riporta il codice di tale operazioni.
private static bool
DecomprimiFileCompresso(string PercorsoFile)
{
bool
Esito = false;
try
{
//eseguo
la prima estrapolazione del file .gz nella stessa cartella dove si trovano i
file .gz
DirectoryInfo
DiPercorsoFileGz = new DirectoryInfo(PercorsoFile);
foreach
(FileInfo fi in
DiPercorsoFileGz.GetFiles("*.gz"))
{
DecomprimiFileGz(fi);
}
//Decomprimo
tutti i file *.tar
Esito =
DecomprimiFileTar(PercorsoFile);
}
catch
(Exception ex)
{
throw
ex;
}
return
Esito;
}
A questo punto viene eseguita una funziona per estrapolare tutti i file di tipo gz e poi successivamente tutti i file di tipo “Tar”.
Qui di seguito sono riportati tali funzioni.
private static bool
DecomprimiFileTar(string PercorsoFile)
{
bool
Esisto = false;
try
{
DirectoryInfo
di = new DirectoryInfo(PercorsoFile);
//Decomprimo
tutti i file di tipo *.tar
foreach (FileInfo fi in
di.GetFiles("*.tar"))
{
string
PercorsoFileDecompresso = "";
string PathCartellaFile = "";
using (FileStream
unarchFile = File.OpenRead(fi.FullName))
{
TarReader reader = new
TarReader(unarchFile);
while (reader.MoveNext(true))
{
var path = reader.FileInfo.FileName;
if (reader.FileInfo.EntryType == EntryType.Directory)
{
//Essendo una cartella verifico se è quella che interessa
(percorso superiore)
if
(PercorsoFile.Contains(Path.GetDirectoryName(path))
== true)
{
//creo la cartella ed estrapolo i dati
PercorsoFileDecompresso = Path.Combine(PercorsoFile,
Path.GetDirectoryName(path));
Directory.CreateDirectory(PercorsoFileDecompresso);
PathCartellaFile = Path.GetDirectoryName(path);
}
}
else
{
//Elaboro solo se nella variabile path (nome file) è
presente la cartella da cui devo estrapolare i dati.
if (path.Contains("MioFile")
& PathCartellaFile.Trim().Length > 1)
{
//verifico che sia superiore a 3000 byte ossia 3 kb
if
(reader.FileInfo.SizeInBytes >= 3000)
{
path = Path.Combine(PercorsoFileDecompresso,
Path.GetFileName(path));
using (FileStream
file = File.Create(path))
{
reader.Read(file);
Esisto = true;
}
}
}
}
}
}
}
}
catch
(Exception ex)
{
throw ex;
}
return
Esisto;
}
public
static void
DecomprimiFileGz(FileInfo pFileInfo)
{
//Rilevo lo
stream dei file e decomprimo tutti i file .
using (FileStream StreamFile = pFileInfo.OpenRead())
{
//imposto
il nome del file togliendo l'estenzione .gz
string
FileCorrente = pFileInfo.FullName;
string FileOrigine =
FileCorrente.Remove(FileCorrente.Length - pFileInfo.Extension.Length);
using (FileStream
outFile = File.Create(FileOrigine))
{
using (GZipStream
Decompress = new GZipStream(StreamFile, CompressionMode.Decompress))
{
byte[] buffer = new byte[4096];
int numRead;
while ((numRead = Decompress.Read(buffer, 0,
buffer.Length)) != 0)
{
outFile.Write(buffer, 0, numRead);
}
}
}
}
}
La funzione “DecomprimiFileTar”, estrae solo quei file che contengono il nome di tipo “MioFile” e che hanno una dimensione superiore ai 3 kb. Questa gestione dei file avviene tramite la classe "TarReader" che permette la gestione dei file compressi.
Conclusioni
L’articolo ha voluto illustrare le potenzialità di questo componente, che può tornare utile anche in quei contesti con sistemi diversi.
Tramite la parola “Download” potete scaricare il progetto di esempio di questo articolo.
domenica 25 gennaio 2015
Ado.Net Excel To Csv creare un file Csv da un file Excel tramite VB.Net e C#
Si riporta l'articolo scritto per il sito http://www.iprogrammatori.it/articoli/programmazione/art_creazione-di-un-file-csv-da-un-file-exce_1371.aspx
In questo articolo vedremo come realizzare una procedura o meglio una “Windows Application” che dato un file Excel genera un file di tipo CSV.
La particolarità di questo progetto è una parte dinamica, nel senso che può essere utilizzata per la versione di Excel 2007 o inferiore, e che la lettura delle colonne avviene tramite indice delle colonne (le lettere, a, b, c, d).
Prima di tutto bisogna creare un file Excel, nella prima colonna precisamente in A1 mettete la dicitura Nome, nella seconda colonna (B1) mettete Cognome, e nella terza colonna (C1) mettete età.
A questo punto valorizzare i vari campi al di sotto, inserendo i dati a vostro piacimento.
Ora non ci resta che aprire Visual Studio 2010 e realizzare tale procedura.
Creazione del progetto
Si crea un nuovo progetto di tipo “Windows Application” tramite il linguaggio di programmazione di proprio interesse (VB.Net o C#) a questo punto, nella form inseriamo quattro controlli Label, quattro controlli TextBox ed un pulsante, il tutto come illustrato in figura 1.
Figura 1 – la form con i vari controlli
Valorizziamo i vari campi con i dati di nostro interesse.
La prima casella conterrà il file CSV da generare, la seconda casella il percorso e nome del file Excel dove estrapolare i dati, il terzo campo, il nome del foglio su cui leggere le informazione, mentre nel quarto ed ultimo campo le colonne su cui leggere i dati.
Ora passiamo in visualizzazione codice facendo doppio sul pulsante con la dicitura "Genera", in modo che vi viene visualizzato l’evento del pulsante.
Qui di seguito si riporta il codice dell’evento click del pulsante.
C#
Come si vede dal codice, viene eseguita una funzione ,a cui sono passati i vari parametri, riguardante i valori inseriti nelle varie caselle di testo.
Di seguito elenchiamo le varie funzioni.
La funzione qui di seguito, permette di generare il file Csv passando il percorso e nome del file e come secondo parametro il testo da scrivere.
La funzione qui di seguito, permette di rilevare il nome delle colonne o meglio i campi della select che andremmo ad eseguire per estrapolare i dati dal file Excel.
L’algoritmo prendendo il nome dagli indici delle colonne (a,b,c,etc) rileva tali campi.
Siamo giunti alla conclusione della stesura del codice, qui di seguito la funzione più importante, quella che ci permette di eseguire le query nel file di Excel ed estrapolare i dati.
Conclusioni
L’articolo ha fornito al lettore delle ottime indicazioni di come creare un programma di tipo Windows Application, flessibile e dinamico per la lettura dei dati da un file di tipo Excel, di qualsiasi versione e generare un file di tipo CSV.
Tramite le classi di Ado.Net e precisamente di OleDB, possiamo lavorare sui file di tipo Excel.
Tramite la parola Download è possibile scaricare il progetto utilizzato in questo articolo.
In questo articolo vedremo come realizzare una procedura o meglio una “Windows Application” che dato un file Excel genera un file di tipo CSV.
La particolarità di questo progetto è una parte dinamica, nel senso che può essere utilizzata per la versione di Excel 2007 o inferiore, e che la lettura delle colonne avviene tramite indice delle colonne (le lettere, a, b, c, d).
Prima di tutto bisogna creare un file Excel, nella prima colonna precisamente in A1 mettete la dicitura Nome, nella seconda colonna (B1) mettete Cognome, e nella terza colonna (C1) mettete età.
A questo punto valorizzare i vari campi al di sotto, inserendo i dati a vostro piacimento.
Ora non ci resta che aprire Visual Studio 2010 e realizzare tale procedura.
Creazione del progetto
Si crea un nuovo progetto di tipo “Windows Application” tramite il linguaggio di programmazione di proprio interesse (VB.Net o C#) a questo punto, nella form inseriamo quattro controlli Label, quattro controlli TextBox ed un pulsante, il tutto come illustrato in figura 1.
Figura 1 – la form con i vari controlli
Valorizziamo i vari campi con i dati di nostro interesse.
La prima casella conterrà il file CSV da generare, la seconda casella il percorso e nome del file Excel dove estrapolare i dati, il terzo campo, il nome del foglio su cui leggere le informazione, mentre nel quarto ed ultimo campo le colonne su cui leggere i dati.
Ora passiamo in visualizzazione codice facendo doppio sul pulsante con la dicitura "Genera", in modo che vi viene visualizzato l’evento del pulsante.
Qui di seguito si riporta il codice dell’evento click del pulsante.
VB.Net
Private
Sub BtnGenera_Click(sender As System.Object,
e As System.EventArgs)
Handles BtnGenera.Click
EseguiElaborazione(TxtFileExcel.Text,
TxtCsv.Text, TxtFoglio.Text, TxtColonne.Text)
MessageBox.Show("Operazione
completata")
End Sub
private
void BtnGenera_Click(object
sender, EventArgs e)
{
EseguiElaborazione(TxtFileExcel.Text,
TxtCsv.Text, TxtFoglio.Text, TxtColonne.Text);
MessageBox.Show("Operazione
completata");
}
Come si vede dal codice, viene eseguita una funzione ,a cui sono passati i vari parametri, riguardante i valori inseriti nelle varie caselle di testo.
Di seguito elenchiamo le varie funzioni.
La funzione qui di seguito, permette di generare il file Csv passando il percorso e nome del file e come secondo parametro il testo da scrivere.
VB.Net
Private
Shared Sub
CreaFileCsv(NomeFileCSV As String, Testo As String)
Try
Using
ScriviFile As New
System.IO.StreamWriter(NomeFileCSV, False)
ScriviFile.WriteLine(Testo)
End
Using
Catch
ex As Exception
Throw
ex
End Try
End Sub
C#
private
static void
CreaFileCsv(string NomeFileCSV, string Testo)
{
try
{
using
(System.IO.StreamWriter ScriviFile = new System.IO.StreamWriter(NomeFileCSV,
false))
{
ScriviFile.WriteLine(Testo);
}
}
catch
(Exception ex)
{
throw ex;
}
}
L’algoritmo prendendo il nome dagli indici delle colonne (a,b,c,etc) rileva tali campi.
VB.Net
Private
Shared Function
OttieniNomeColonne(pColonne As DataTable, LetteraColonna As
String) As String
Dim
LettereExcel As String
= "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
'26
Dim
Colonne As String()
= LetteraColonna.Split(","c)
Dim
NomeColonna As String
= ""
For
ContaColonne As Integer
= 0 To Colonne.Length - 1
If
ContaColonne > 0 Then
NomeColonna += ","
End
If
Dim
Indice As Integer
= -1
If
Colonne(ContaColonne).Trim().Length > 1 Then
For
ContaElementi As Integer
= 0 To Colonne(ContaColonne).Length - 1
If
ContaElementi > 0 Then
Indice += 25 +
LettereExcel.IndexOf(Colonne(ContaColonne).Trim().Substring(ContaElementi + 1))
Else
Indice =
LettereExcel.IndexOf(Colonne(ContaColonne).Trim().Substring(ContaElementi + 1))
+ 1
End If
Next
Else
Indice = LettereExcel.IndexOf(Colonne(ContaColonne).Trim())
End If
NomeColonna += pColonne.Columns(Indice).ColumnName.Trim()
Next
Return
NomeColonna
End Function
C#
private string OttieniNomeColonne(DataTable
pColonne, string LetteraColonna)
{
string
LettereExcel = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//26
string[] Colonne = LetteraColonna.Split(',');
string
NomeColonna = "";
for (int ContaColonne
= 0; ContaColonne < Colonne.Length; ContaColonne++)
{
if (ContaColonne > 0)
{
NomeColonna += ",";
}
int
Indice = -1;
if (Colonne[ContaColonne].Trim().Length
> 1)
{
for (int
ContaElementi = 0; ContaElementi < Colonne[ContaColonne].Length;
ContaElementi++)
{
if (ContaElementi > 0)
{
Indice += 25 +
LettereExcel.IndexOf(Colonne[ContaColonne].Trim().Substring(ContaElementi +
1));
}
else
{
Indice =
LettereExcel.IndexOf(Colonne[ContaColonne].Trim().Substring(ContaElementi + 1))
+ 1;
}
}
}
else
{
Indice = LettereExcel.IndexOf(Colonne[ContaColonne].Trim());
}
NomeColonna += pColonne.Columns[Indice].ColumnName.Trim();
}
return NomeColonna;
}
Siamo giunti alla conclusione della stesura del codice, qui di seguito la funzione più importante, quella che ci permette di eseguire le query nel file di Excel ed estrapolare i dati.
VB.Net
Private
Sub EseguiElaborazione(PercorsoFileExcel As String,
PercorsoFileCsv As String,
NomeFoglio As String,
Colonne As String)
Try
Dim
strConnectionString As String
= ""
If
PercorsoFileExcel.Trim().EndsWith(".xlsx")
Then
strConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data
Source={0};Extended Properties=" & ChrW(34) & "Excel 8.0;HDR=Yes;IMEX=1" &
ChrW(34), PercorsoFileExcel)
ElseIf
PercorsoFileExcel.Trim().EndsWith(".xls")
Then
strConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source={0};Extended Properties=""Excel 8.0;HDR=Yes"";",
PercorsoFileExcel)
End If
'mi connetto alla base dati
Using ObJConnection As New OleDbConnection(strConnectionString)
ObJConnection.Open()
Dim
DtrRecord As OleDbDataReader
Dim
DtaQuery As New
OleDbDataAdapter("Select
top 1 * from [" & NomeFoglio & "$] ;", ObJConnection)
Dim
DttDati As New DataTable()
DtaQuery.Fill(DttDati)
'Rilevo l'intestazione delle colonne
Colonne = OttieniNomeColonne(DttDati, Colonne)
'Ottengo i dati dopo aver rilevato i nomi
delle colonne
Dim
DbCommandQuery As New
OleDbCommand("Select
" & Colonne & " from [" & NomeFoglio & "$] ;")
DbCommandQuery.Connection =
ObJConnection
DtrRecord =
DbCommandQuery.ExecuteReader()
Dim
DttDatiRisultato As New
DataTable()
'Rendo le colonne di tipo string
Dim
lNomeColonna As String()
= Colonne.Split(",")
For
Each Colonna As
String In
lNomeColonna
DttDatiRisultato.Columns.Add(Colonna,
GetType(String))
Next
DttDatiRisultato.Load(DtrRecord)
Dim
TestoDaScrivere As String
= ""
For
Each Elemento As
DataRow In
DttDatiRisultato.Rows
For
ContaColonne As Integer
= 0 To Elemento.ItemArray.Length - 2
TestoDaScrivere +=
Elemento(ContaColonne).ToString() & ";"
Next
If
TestoDaScrivere.Substring(TestoDaScrivere.Length - 1, 1) = ";" Then
TestoDaScrivere =
TestoDaScrivere.Substring(0, TestoDaScrivere.Length - 1)
End
If
TestoDaScrivere += vbCr & vbLf
Next
CreaFileCsv(PercorsoFileCsv, TestoDaScrivere)
End Using
Catch
ex As Exception
Throw
ex
End Try
End Sub
C #
private void EseguiElaborazione(string PercorsoFileExcel, string
PercorsoFileCsv, string NomeFoglio, string Colonne)
{
try
{
string
strConnectionString = "";
if
(PercorsoFileExcel.Trim().EndsWith(".xlsx"))
strConnectionString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data
Source={0};Extended Properties=" + (char)34
+ "Excel 8.0;HDR=Yes;IMEX=1" + (char)34, PercorsoFileExcel);
else
if (PercorsoFileExcel.Trim().EndsWith(".xls"))
{
strConnectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data
Source={0};Extended Properties=\"Excel 8.0;HDR=Yes\";",
PercorsoFileExcel);
}
//mi
connetto alla base dati
using
(OleDbConnection ObJConnection = new OleDbConnection(strConnectionString))
{
ObJConnection.Open();
OleDbDataReader
DtrRecord;
OleDbDataAdapter
DtaQuery = new OleDbDataAdapter("Select top 1 * from [" + NomeFoglio + "$] ;",
ObJConnection);
DataTable
DttDati = new DataTable();
DtaQuery.Fill(DttDati);
//Rilevo
l'intestazione delle colonne
Colonne = OttieniNomeColonne(DttDati, Colonne);
//Ottengo i dati dopo aver rilevato i nomi
delle colonne
OleDbCommand
DbCommandQuery = new OleDbCommand("Select " + Colonne + " from
[" + NomeFoglio + "$] ;");
DbCommandQuery.Connection =
ObJConnection;
DtrRecord =
DbCommandQuery.ExecuteReader();
DataTable
DttDatiRisultato = new DataTable();
//Rendo le colonne di
tipo string
string[] lNomeColonna = Colonne.Split(',');
foreach (var
Colonna in lNomeColonna)
{
DttDatiRisultato.Columns.Add(Colonna, typeof(string));
}
DttDatiRisultato.Load(DtrRecord);
string
TestoDaScrivere = "";
foreach (DataRow
Elemento in DttDatiRisultato.Rows)
{
for (int ContaColonne = 0;
ContaColonne < Elemento.ItemArray.Length - 1; ContaColonne++)
{
TestoDaScrivere +=
Elemento[ContaColonne].ToString()+ ";";
}
if (TestoDaScrivere.Substring(TestoDaScrivere.Length - 1, 1) == ";")
{
TestoDaScrivere =
TestoDaScrivere.Substring(0, TestoDaScrivere.Length - 1);
}
TestoDaScrivere += "\r\n";
}
CreaFileCsv(PercorsoFileCsv,
TestoDaScrivere);
}
}
catch
(Exception ex)
{
throw
ex;
}
}
Conclusioni
L’articolo ha fornito al lettore delle ottime indicazioni di come creare un programma di tipo Windows Application, flessibile e dinamico per la lettura dei dati da un file di tipo Excel, di qualsiasi versione e generare un file di tipo CSV.
Tramite le classi di Ado.Net e precisamente di OleDB, possiamo lavorare sui file di tipo Excel.
Tramite la parola Download è possibile scaricare il progetto utilizzato in questo articolo.
Iscriviti a:
Post (Atom)