salesforce中支持对csv格式的内容批量导入,可以使用dataloader,然而有些情况下,当用户没有相关权限使用dataloader导入情况下,就的需要使用VF和apex代码来搞定。
基本想法:
1.通过<apex:inputFile>标签弹出选择文件对话框,选择相应的csv文件;
2.将相关csv文件转换成字符串并加以解析;
3.将解析的字符串通过相关分隔存储到列表中,并插入到数据库。
储备知识:
1.csv:具有以下特征:
此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的数量等等,有兴趣需要的童鞋可以在此基础上进行优化。如果内容有错误地方欢迎指正,如果有问题的地方欢迎留言,转载请注明出处。