salesforce 零基礎學習(二十四)解析csv格式內容


salesforce中支持對csv格式的內容批量導入,可以使用dataloader,然而有些情況下,當用戶沒有相關權限使用dataloader導入情況下,就的需要使用VF和apex代碼來搞定。

基本想法:

  1.通過<apex:inputFile>標簽彈出選擇文件對話框,選擇相應的csv文件;

  2.將相關csv文件轉換成字符串並加以解析;

  3.將解析的字符串通過相關分隔存儲到列表中,並插入到數據庫。

儲備知識:

1.csv:具有以下特征:

  1. 純文本;
  2. 由記錄組成(典型的是每行一條記錄);
  3. 每條記錄被分隔符分隔為字段(典型分隔符有逗號、分號或制表符;有時分隔符可以包括可選的空格);
  4. 每條記錄都有同樣的字段序列。

此csv文件通過記事本打開顯示內容如下:

2.Blob:二進制對象類型。通過inputFile選中后的文件在后台獲取的時候是一個Blob類型,此類型為二進制類型。通過相關轉換可以將其轉換成String類型,后續代碼中會提供。

注:一個String類型字符串占四個字節,32位,兩個16進制字符的長度。

功能制作:

1.表結構:Vendor__c里面有三個字段,分別為:

Vendor_Code__c ,Vendor_Code_EN__c ,Vendor_Name__c,三個字段類型均為Text類型。

2.BatchInsertByCsvController

 1 public class BatchInsertByCsvController 
 2 {
 3     public string fileName{get;set;}
 4     public Blob contentFile{get;set;}
 5     String[] filelines = new String[]{};
 6     public List<Vendor__c> vendorList;
 7     
 8     public Pagereference ReadFileAndOperate()
 9     {
10         try{        
11             fileName =bitToString( contentFile,'ISO-8859-1');           
12             filelines = fileName.split('\n');            
13             vendorList = new List<Vendor__c>();
14             for (Integer i=1;i<filelines.size();i++)
15             {
16                 String[] inputvalues = new String[]{};
17                 inputvalues = filelines[i].split(',');
18                 Vendor__c vendor = new PRDS_Vendor__c();
19                 vendor.Vendor_Code__c = inputvalues[0];
20                 vendor.Vendor_Code_EN__c = inputvalues[1];
21                 vendor.Vendor_Name__c = inputvalues[2];
22                 vendorList.add(vendor);
23             }
24          }
25          catch(Exception e){
26                  ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured reading the CSV file'+e.getMessage());
27                  ApexPages.addMessage(errormsg);
28          }       
29         try{
30             insert vendorList;
31             ApexPages.Message successMsg = new ApexPages.Message(ApexPages.severity.INFO,'import success');
32             ApexPages.addMessage(successMsg);
33         }
34         catch (Exception e)
35         {
36             ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured inserting the records'+e.getMessage());
37             ApexPages.addMessage(errormsg);
38         }
39         return null;
40     }
41    
42     public List<PRDS_Vendor__c> getuploadedVendors()
43     {
44         if (vendorList!= null) {
45             if (vendorList.size() > 0) {
46                 return vendorList;
47             } else {
48                 return null;                    
         }
49 }else { 50 return null;
       }
51 } 52 53 public static String bitToString(Blob input, String inCharset){ 54 //轉換成16進制 55 String hex = EncodingUtil.convertToHex(input); 56 //一個String類型兩個字節 32位(bit),則一個String長度應該為兩個16進制的長度,所以此處向右平移一個單位,即除以2 57 //向右平移一個單位在正數情況下等同於除以2,負數情況下不等 58 //eg 9 00001001 >>1 00000100 結果為4 59 final Integer bytesCount = hex.length() >> 1; 60 //聲明String數組,長度為16進制轉換成字符串的長度 61 String[] bytes = new String[bytesCount]; 62 for(Integer i = 0; i < bytesCount; ++i) { 63 //將相鄰兩位的16進制字符串放在一個String中 64 bytes[i] = hex.mid(i << 1, 2); 65 } 66 //解碼成指定charset的字符串 67 return EncodingUtil.urlDecode('%' + String.join(bytes, '%'), inCharset); 68 } 69 }

3.UploadVendorPage

 1 <apex:page sidebar="false" controller="BatchInsertByCsvController" showHeader="false">
 2    <apex:form >
 3       <apex:sectionHeader title="通過csv文件導入vendor"/>
 4       <apex:pagemessages />
 5       <apex:pageBlock >
 6              <center>
 7               <apex:inputFile value="{!contentFile}" filename="{!fileName}" /> 
 8               <apex:commandButton action="{!ReadFileAndOperate}" value="Batch insert"/>
 9              </center>  
10       </apex:pageBlock>       
11    </apex:form>   
12 </apex:page>

 展示:csv文件格式需要如上圖所示,A列Vendor Code,B列Vendor Code EN,C列Vendor Name.選擇文件后點擊Batch insert即可將數據插入到數據庫中。

總結:csv文件格式為純文本文件格式,按照行組成。解析時只要通過回車符以及,進行相關分割便可以獲取到相關的內容。上述代碼沒有太優化,比如上述代碼如果csv文件超過10000便超過insert的數量等等,有興趣需要的童鞋可以在此基礎上進行優化。如果內容有錯誤地方歡迎指正,如果有問題的地方歡迎留言,轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM