อยากทราบวิธีการ export เป็น excel.csv ให้ตัวเลขที่มี 0 อยู่ข้างหลัง ค่ะ
อยากทราบวิธีการ export เป็น excel.csv ให้ตัวเลขที่มี 0 อยู่ข้างหลัง ให้มันโชว์ด้วย
เช่น 100200 เวลา export ออกมา excel จะตัดเหลือแค่ 1002 ต้องทำอย่างไรคะ
หรือว่าต้องเซ็ทตอนคำสั่ง export ด้วยคะ
เขียนโค๊ตไว้แบบนี้ค่ะ ยกมาแค่ตัวที่เขียนข้อมูลนะค่ะ
Function ExportToCSV(ByVal dt)
Dim objConn As System.Data.OleDb.OleDbConnection
Dim objCmd As System.Data.OleDb.OleDbCommand
Dim strConnString, strSQL As String
Dim i As Integer
'*** Create Text Files (Columns Default ***' ***'
Dim StrWer As StreamWriter
StrWer = File.CreateText(Server.MapPath(strPath) & strFileName)
StrWer.Write("PM,SBU,MainCustCode,MainCustName")
StrWer.Close()
'*** Connect to CSV ***'
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(strPath) & _
";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)'"
objConn = New System.Data.OleDb.OleDbConnection(strConnString)
objConn.Open()
'*** Loop Write CSV ***'
For i = 0 To dt.Rows.Count - 1
strSQL = "INSERT INTO " & strFileName & " (PM,SBU,MainCustCode,MainCustName)" & _
"VALUES ('" & dt.Rows(i)("PM") & "','" & dt.Rows(i)("SBU") & "','" & dt.Rows(i)("MainCustCode") & "','" & dt.Rows(i)("MainCustName") & "')"
objCmd = New System.Data.OleDb.OleDbCommand()
With (objCmd)
objCmd.Connection = objConn
objCmd.CommandType = CommandType.Text
objCmd.CommandText = strSQL
End With
objCmd.ExecuteNonQuery()
Next
Me.lblText.Text = "Export Successfully <a href=" & strPath & strFileName & " >Click here</a> "
objCmd = Nothing
objConn.Close()
objConn = NothingTag : - - - -
Date :
2010-03-17 23:19:59
By :
Angel_baba
View :
7425
Reply :
22
algoritm ของคุณ
1. สร้างไฟล์ csv กำหนด column แล้วปิดไฟล์
2. ติดต่อ csv โดยใช้ oledb connection
3. วนลูปข้อมูลโดยใช้ sql command insert ข้อมูลลง csv ที่สร้าง connection ไว้
4. ปิด oledb connection
ลองดูแบบนี้
Code (VB.NET)
Dim objConn As System.Data.OleDb.OleDbConnection
Dim objCmd As System.Data.OleDb.OleDbCommand
Dim strConnString, strSQL As String
Dim i As Integer
'*** Create Text Files (Columns Default ***' ***'
Dim StrWer As StreamWriter
StrWer = File.CreateText(Server.MapPath(strPath) & strFileName)
StrWer.Write("PM,SBU,MainCustCode,MainCustName")
StrWer.Close()
'*** Connect to CSV ***'
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(strPath) & ";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)'"
objConn = New System.Data.OleDb.OleDbConnection(strConnString)
'*** Loop Write CSV ***'
For i = 0 To dt.Rows.Count - 1
strSQL = "INSERT INTO [" & strFileName & "] ([PM], [SBU], [MainCustCode], [MainCustName]) VALUES (@PM, @SBU, @MainCustCode, @MainCustName)"
objCmd = New System.Data.OleDb.OleDbCommand(strSQL, objConn)
objCmd.Parameters.AddWithValue("@PM", dt.Rows(i)("PM").ToString())
objCmd.Parameters.AddWithValue("@SBU", dt.Rows(i)("SBU").ToString())
objCmd.Parameters.AddWithValue("@MainCustCode", dt.Rows(i)("MainCustCode").ToString())
objCmd.Parameters.AddWithValue("@MainCustName", dt.Rows(i)("MainCustName").ToString())
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
Next
Me.lblText.Text = "Export Successfully <a href=" & strPath & strFileName & " >Click here</a> "
Date :
2010-03-18 12:15:58
By :
tungman
ลองทำตามที่คุณ tungman บอกแล้วมันไม่ได้ค่ะ มันก็ยังตัด 0 ที่อยู่ข้างหลังออกไปค่ะ
เขียนแบบนี้ค่ะ
Dim objConn As System.Data.OleDb.OleDbConnection
Dim objCmd As System.Data.OleDb.OleDbCommand
Dim strConnString, strSQL As String
Dim i As Integer
'*** Create Text Files (Columns Default ***' ***'
Dim StrWer As StreamWriter
StrWer = File.CreateText(Server.MapPath(strPath) & strFileName)
StrWer.Write("PM,Code,Description")
StrWer.Close()
'*** Connect to CSV ***'
strConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Server.MapPath(strPath) & _
";Extended Properties='TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)'"
objConn = New System.Data.OleDb.OleDbConnection(strConnString)
'*** Loop Write CSV ***'
For i = 0 To dt.Rows.Count - 1
strSQL = "INSERT INTO " & strFileName & " ([PM],[Code],[Description]) VALUES (@PM,@StockCode,@Description) "
objCmd = New System.Data.OleDb.OleDbCommand(strSQL, objConn)
objCmd.Parameters.AddWithValue("@PM", dt.Rows(i)("PM").ToString())
objCmd.Parameters.AddWithValue("@Code", dt.Rows(i)("Code").ToString())
objCmd.Parameters.AddWithValue("@Description", dt.Rows(i)("Description").ToString())
objConn.Open()
objCmd.ExecuteNonQuery()
objConn.Close()
Next
Me.lblText.Text = "Export Successfully <a href=" & strPath & strFileName & " >Click here</a> "
objCmd = Nothing
objConn.Close()
objConn = Nothing
Date :
2010-03-22 11:45:53
By :
Angel_baba
ไม่น่าเกี่ยวกับ code นะ ลองตรวจสอบ value ใน dt ก่อนไหม
ลอง response.write มาดูก่อน
Date :
2010-03-22 12:51:20
By :
tungman
write ออกมาแล้วเป็นแบบนี้ค่ะ
Watjana 105432.2500 AMMONIA
แต่พอ export ออกมาแล้วจะได้แบบนี้ค่ะ Watjana 105432.25 AMMONIA
ปกติ excel ถ้าอยากให้เก็บ 0 ข้างหลังไว้จะต้องตั้งฟอแมตเซลให้เป็น Text ก่อนถึงจะได้ค่ะ
แต่ที่ export นี่เป็น .csv เลยไม่รู้จะทำอย่างไรค่ะ
Date :
2010-03-22 13:49:54
By :
Angel_baba
งั้นถ้า
Watjana 105432.2500 AMMONIA เป็น Watjana 105432.25 AMMONIA
แล้ว
XXXXX 9999.9999 YYY น่าจะเป็น XXXXX 9999.9999 YYY
คือต้องการเก็บค่าตัวเลขด้วย 4 digit หลังจุดทศนิยมยังงั้นหรอคะ
แล้ว ตัว data จริงๆ จาก excel เป็นยังไงหรอคะ
เช่น 9999.99999999999999 แล้วตัดเป็น 9999.9999
หรือว่่าอย่างไรคะ
Date :
2010-03-22 14:31:37
By :
blurEye
ไม่ค่ะ นี่ไม่ใช่จำนวน แต่เป็นตัวเลขที่บางทีอาจจะเป็น 00-1001 หรืออาจะเป็น 102.25030 หรืออะไรก็ได้ค่ะ
ประเด็นคือ excel มันจะมองตัวเลขในเซลเป็นจำนวน ถ้ามี 0 ต่อท้าย เช่น 100 มันจะตัดเหลือแค่ 1 แล้วทีนี้ code ที่เราตั้งไว้มันคือ 100 พอเอาไป lookup มันก็จะหาไม่เจอ มันจะไป lookup 1 แทนค่ะ
Date :
2010-03-22 14:44:51
By :
Angel_baba
นี่ไม่ใช่จำนวน แต่เป็นตัวเลข ???
excel มันจะมองตัวเลขในเซลเป็นจำนวน ???
เอาไป lookup ???
แล้วข้อมูลใน cell excel ยังถูกต้องหรือเปล่าคะ
ถ้ายังถูก ก็ไม่ต้องใช้ lookup ของ excel ใช้ query ดึงออกจะถูกหรือเปล่า
หรือ query ก็ใช้ วิธี lookup อีก ถ้าอย่างนั้นคงไม่ต้อง lookup ไม่ต้อง query
อ่านมาทีละแถวแล้ว ตรวจเองดีกว่ามั้ยคะ
จากสมมุติฐานว่าข้อมูลใน cell ยังถูกต้อง
คือจะเข้าใจยากๆสักหน่อยค่ะเพราะไม่เห็นตัว excel ไม่เห็น process
Date :
2010-03-22 17:31:36
By :
blurEye
นี่ไม่ใช่จำนวน แต่เป็นตัวเลข ???
--- มันเป็นตัวอักษรค่ะ มันไม่ใช่จำนวน แต่ excel จะมองว่าเป็นตัวเลข
excel มันจะมองตัวเลขในเซลเป็นจำนวน ???
--- ใช่ถ้าเราไม่กำหนดฟอแมตเซลให้มันเป็น text สะ
เอาไป lookup ???
--- เราต้องให้เค้า export ออกไปแล้ว import กลับเข้ามาใหม่ แล้วเราต้องทำการ update ข้อมูลที่มีการเปลี่ยนแปลง แล้วทีนี้ถ้าตอน export ออกไปดันไปตัด 0 ออก มันก็จะหาตัวเลขเดิมไม่เจอ ดังนั้นเลยจะต้องหาวิธี เก็บ 0 ข้างหลังไว้ งงมั้ย ????
ส่วนในฐานข้อมูล mssql จะเก็บไว้แบบนี้ค่ะ
Watjana 105432.2500 AMMONIA
vasana 105432-2001 Testtttt
แล้วพอเรา export ไปเป็นไฟล์ excel.csv ข้อมูลที่ได้จะเป็นแบบนี้ค่ะ
Watjana 105432.25 AMMONIA
vasana 105432-2001 Testtttt
Date :
2010-03-22 18:31:37
By :
Angel_baba
พอเข้าใจเรื่องราวได้เป็นรูปร่างแล้วค่ะ เอ๋นี่โค้ดที่ทำงานป่าวคะหรือว่าเรียนอยู่
ออกจะเป็นงานประยุกต์มากเลยนะคะ
เข้าเรื่องกัน .CSV ว่ากันตามหลักแล้วคือ text file ฉะนั้น 12.10000 ก็จะยังเป็น 12.10000 เช่นเดิม
ปัญหาเกิดขึ้นเมื่อ import โดย excel หรอคะ เพราะน่าจะเกิดจากขบวนการอันซับซ้อนที่ตรงนั้น
ถ้าใช่
แล้วทำไมไม่เขียนเป็น .XLS จะด้วย excel application หรือ external library
แต่ไม่ใช่ด้วย ADO.NET นะคะ เพราะต้องการ format cell
เพื่อจะได้บังคับลงไปเลย cell นี้น่ะคือ TEXT ค่าเป็น 12.10000 เสียเลยละคะ
และให้ดีก็เขียนมันออกไปทั้งสองไฟล์เลยทั้ง .CSV และ .XLS ????
เพราะ .XLS เวลา export เมื่อกำหนดคุณสมบัติของ cell เป็น text ไปเสียแล้ว .CSV ก็คงมีข้อมูลตามนั้นค่ะ
Date :
2010-03-22 19:02:58
By :
blurEye
สรุปว่าเราเข้าใจตรงกันมั้ยคะ ?????
ประเด็นคืนคือไม่สนใจตอน imports แค่อธิบายหลักการทำงานของมันเฉยๆค่ะ
ตอนนี้ที่ต้องการคืออยากให้เอาตัวเลข 0 ที่อยู่ข้างหลัง ออกมาให้ครบ และต้องเป็น .csv เท่านั้นค่ะ
รบกวนด้วยค่ะ
Date :
2010-03-23 14:22:09
By :
Angel_baba
ผมลองโค้ดดูแล้วไม่เห็นเป็นแบบที่คุณว่าเลย ศูนย์มันก็ครบทุกตัวนี่
Code (C#)
StreamWriter writer = File.CreateText(Server.MapPath("~/test.csv"));
writer.Write("PM,StockCode,Description");
writer.Close();
OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" + Server.MapPath("~/") + ";Extended Properties=\"TEXT;HDR=Yes;FMT=Delimited;Format=Delimited(,)\";");
foreach (DataRow Dr in Dt.Rows)
{
string commandString = "INSERT INTO [test.csv] ([PM], [StockCode], [Description]) VALUES (@PM, @StockCode, @Description)";
OleDbCommand command = new OleDbCommand(commandString, connection);
command.Parameters.AddWithValue("@PM", Dr["PM"].ToString());
command.Parameters.AddWithValue("@PM", Dr["StockCode"].ToString());
command.Parameters.AddWithValue("@PM", Dr["Description"].ToString());
try
{
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
test.csv
PM,StockCode,Description
"tungman1","1200.1500","action1"
"tungman2","2800.6800","action2"
Date :
2010-03-23 15:31:08
By :
tungman
ถ้าใช้ notepad เปิดมันก็มีครบ
แต่ใช้ excel เปิดมันจะตัดศูนย์ออก เพราะมันคิดว่าเป็นตัวเลข
ดังนั้นวิธีแก้คงต้องเพิ่มอักษรที่ให้ excel มันรู้ว่าเป็น text เข้าไปแล้วแหละ
Date :
2010-03-23 15:36:55
By :
tungman
คิดว่าเข้าใจนะคะ เพราะเคยเจอปัญหาลักษณะเดียวกันแต่กับ excel
คือ export ข้อมูลออกเป็น excel file แต่ภาษาไทยเป็น ??? หมด
ต้นตอปัญหาเหมือนกันคือ excel เวลา import ไฟล์อะไรเข้ามา
excel จะใช้ wizard จัดการกับข้อมูลให้ ซึ่งบางทีเราไม่ต้องการ
มาดูปัญหาของคุณกัน คือตัว .CSV นี่ข้อมูลถูกแน่นอนเพราะเป็น text file เขียนอย่างไรก็เป็นอย่างนั้น
แต่ทีนี้เวลานำมาใช้งาน เข้าใจว่าจะใช้ excel import เข้าไปเพื่อทำอะไรสักอย่างกับข้อมูล
แล้ว excel เปลี่ยนแปลงข้อมูลบางอย่างตอน import ด้วยถูกตั้งให้เป็นแบบนี้มาตั้งแต่แรก
พอคุณ view ดู Excel ก็เลยเห็นว่าข้อมูลผิด มันไม่ใช่ มันไม่ได้เกิดมาเพื่อสิ่งนี้ชะปะคะ
ทางแก้
ต้องปรับเปลี่ยนพฤติกรรมของ excel ตอน import เข้ามาว่าอย่ามาทำอะไรกับข้อมูลของดิชั้น
ด้วยการบอกนี้ นี้ๆๆๆ และโน่นๆๆ เป็น text
ก็เลยแนะนำให้คุณ export file ออกมา 2 format ค่ะ
คือ .CSV(1) และ .XLS
ซึ่งเดาอีกว่าคุณจะใช้ EXCEL ไปปรับปรุงข้อมูลแล้ว EXPORT กลับออกมาเป็น .CSV(2)
แล้วนำ .CSV(1) และ .CSV(2) มาเทียบกันใช่หรือเปล่าคะ
ตัว .XLS ที่ Export ออกมาพร้อมกับ .CSV เพื่อให้คุณปรับแก้พฤติกรรมของ EXCEL
ซึ่งเราจะเขียนข้อมูลลงไปที่ cell แต่ละ cell ด้วย code และ set format ต่างๆของ cell ได้อย่างเบ็ดเสร็จเด็ดขาด
เสียก่อน และเป็นข้อมูลที่เหมือนกับ .CSV(1) ขั้นตอนนี้จะอัตโนมัติค่ะ
หรือคุณจะเขียน excel vba IMPORT .CSV(1) เป็นการเฉพาะก็ได้แต่จะเพิ่มขั้นตอนให้ USER
Date :
2010-03-23 23:44:20
By :
blurEye
[font=Verdana]ดังนั้นวิธีแก้คงต้องเพิ่มอักษรที่ให้ excel มันรู้ว่าเป็น text เข้าไปแล้วแหละ[/font]
ตอนแรกคิดว่าจะใส่ " ครอบไว้แต่ว่ามัน errorค่ะ เพราะจะไปแก้ไขตัวรหัสก็คงไม่ได้ค่ะ อย่างนี้ต้องใส่อะไรดีคะ
Date :
2010-03-24 12:11:06
By :
Angel_baba
กระซิบๆๆๆๆ อย่าให้ user ได้ยิน
เอา space ต่อด้านหลังได้ป่ะ หลอก user
แต่เวลาใช้งานจริงก็เอาออก
Date :
2010-03-24 12:21:27
By :
tungman
ลองแล้ว ใช้ space
เปลี่ยนเป็นเลขไทย ไม่ได้หมดเลย excel มันตัดหมด
แต่เอา single quote คลอบไว้ได้ป่ะ
Date :
2010-03-24 12:30:36
By :
tungman
Column ''PM'' does not belong to table . ฟ้องแบบนี้ค่ะ
objCmd.Parameters.AddWithValue("@PM", dt.Rows(i)("'PM'").ToString())
ใส่ไว้แบบนี้ค่ะ
Date :
2010-03-24 14:57:46
By :
Angel_baba
Code (VB.NET)
objCmd.Parameters.AddWithValue("@PM", "'" & dt.Rows(i)("PM").ToString() & "'")
Date :
2010-03-24 15:41:16
By :
tungman
กำลังจะมาบอกว่าใส่ ; ไปข้างหลัง user จะได้ไม่ผิดสังเกตุมาก ค่ะ
ขอบคุณนะค่ะ
Date :
2010-03-24 16:10:24
By :
Angel_baba
c#
เพิ่ม "\"" นำหน้า(หรือต่อท้ายก็ได้เพื่อให้ รู้ว่าเป็น text) ของผมใช้นำหน้าครับ
ex.
strLine = strLine + "\"" + dt2.Rows[i][j].ToString().Replace(",", " ");
Date :
2022-11-10 16:26:47
By :
vanathorn
Date :
2022-11-10 16:29:30
By :
vanathorn
เพิ่ม "\"" นำหน้า(หรือต่อท้ายก็ได้เพื่อให้ รู้ว่าเป็น text)
ex.
strLine = strLine + "\"" + dt2.Rows[i][j].ToString().Replace(",", " ");
- เพิ่งเจอ case ใช้ในกรณี ที่เป็น column สุดท้าย ถ้าใช้ใน column อื่น จะไม่ได้
- แก้ไขโดย strLine += string.Format("{0}", "\t" + dt2.Rows[i][j].ToString());
example.
======
string strLine = "";
string strDelimiter = ",";
StringWriter writer = new StringWriter();
DataTable dt = new DataTable();
dt = getDataTable(strStatement);
string strSQL = your_strStatement;
int intCntRow = dt.Rows.Count;
int intCntCol = yourwant;
for (int i = 0; i < intCntRow; i++) {
strLine = "";
for (int j = 0; j < intCntCol; j++) {
strLine += string.Format("{0}", "\t" + dt.Rows[i][j].ToString());
if (j < intCntCol-1) strLine += strDelimiter;
}
strData.AppendLine(strLine);
}
//htmlWriter.Close();
Response.Clear();
//Response.ContentEncoding = System.Text.Encoding.Default; //System.Text.Encoding.UTF8;
Response.Charset = "windows-874";
Response.ContentEncoding = System.Text.Encoding.GetEncoding(874);
Response.Buffer = true;
Response.ContentType = "text/csv";//"application/ms-excel";//;
Response.AppendHeader("content-disposition", "attachment; filename=" + filename + ".csv");
Response.Write(strData.ToString());
Response.Flush();
Response.End();
HttpContext.Current.ApplicationInstance.CompleteRequest();
Date :
2022-11-10 17:45:59
By :
vanathorn
Load balance : Server 01