salesforce 零基础学习(二十四)解析csv格式内容
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
public class BatchInsertByCsvController
{
public string fileName{get;set;}
public Blob contentFile{get;set;}
String[] filelines = new String[]{};
public List<Vendor__c> vendorList; public Pagereference ReadFileAndOperate()
{
try{
fileName =bitToString( contentFile,'ISO-8859-1');
filelines = fileName.split('\n');
vendorList = new List<Vendor__c>();
for (Integer i=1;i<filelines.size();i++)
{
String[] inputvalues = new String[]{};
inputvalues = filelines[i].split(',');
Vendor__c vendor = new PRDS_Vendor__c();
vendor.Vendor_Code__c = inputvalues[0];
vendor.Vendor_Code_EN__c = inputvalues[1];
vendor.Vendor_Name__c = inputvalues[2];
vendorList.add(vendor);
}
}
catch(Exception e){
ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured reading the CSV file'+e.getMessage());
ApexPages.addMessage(errormsg);
}
try{
insert vendorList;
ApexPages.Message successMsg = new ApexPages.Message(ApexPages.severity.INFO,'import success');
ApexPages.addMessage(successMsg);
}
catch (Exception e)
{
ApexPages.Message errormsg = new ApexPages.Message(ApexPages.severity.ERROR,'An error has occured inserting the records'+e.getMessage());
ApexPages.addMessage(errormsg);
}
return null;
} public List<PRDS_Vendor__c> getuploadedVendors()
{
if (vendorList!= null) {
if (vendorList.size() > 0) {
return vendorList;
} else {
return null;
}
}else {
return null;
}
} public static String bitToString(Blob input, String inCharset){
//转换成16进制
String hex = EncodingUtil.convertToHex(input);
//一个String类型两个字节 32位(bit),则一个String长度应该为两个16进制的长度,所以此处向右平移一个单位,即除以2
//向右平移一个单位在正数情况下等同于除以2,负数情况下不等
//eg 9 00001001 >>1 00000100 结果为4
final Integer bytesCount = hex.length() >> 1;
//声明String数组,长度为16进制转换成字符串的长度
String[] bytes = new String[bytesCount];
for(Integer i = 0; i < bytesCount; ++i) {
//将相邻两位的16进制字符串放在一个String中
bytes[i] = hex.mid(i << 1, 2);
}
//解码成指定charset的字符串
return EncodingUtil.urlDecode('%' + String.join(bytes, '%'), inCharset);
}
}
3.UploadVendorPage
<apex:page sidebar="false" controller="BatchInsertByCsvController" showHeader="false">
<apex:form >
<apex:sectionHeader title="通过csv文件导入vendor"/>
<apex:pagemessages />
<apex:pageBlock >
<center>
<apex:inputFile value="{!contentFile}" filename="{!fileName}" />
<apex:commandButton action="{!ReadFileAndOperate}" value="Batch insert"/>
</center>
</apex:pageBlock>
</apex:form>
</apex:page>
展示:csv文件格式需要如上图所示,A列Vendor Code,B列Vendor Code EN,C列Vendor Name.选择文件后点击Batch insert即可将数据插入到数据库中。

总结:csv文件格式为纯文本文件格式,按照行组成。解析时只要通过回车符以及,进行相关分割便可以获取到相关的内容。上述代码没有太优化,比如上述代码如果csv文件超过10000便超过insert的数量等等,有兴趣需要的童鞋可以在此基础上进行优化。如果内容有错误地方欢迎指正,如果有问题的地方欢迎留言,转载请注明出处。
salesforce 零基础学习(二十四)解析csv格式内容的更多相关文章
- salesforce 零基础学习(十九)Permission sets 讲解及设置
Permission sets以及Profile是常见的设置访问权限的方式. Profile规则为'who see what'.通过Profile可以将一类的用户设置相同的访问权限.对于有着相同Pro ...
- salesforce 零基础学习(十八)WorkFlow介绍及用法
说起workflow大家肯定都不陌生,这里简单介绍一下salesforce中什么情况下使用workflow. 当你分配许多任务,定期发送电子邮件,记录修改时,可以通过自动配置workflow来完成以上 ...
- salesforce 零基础学习(十六)Validation Rules & Date/time
上一篇介绍的内容为Formula,其中的Date/time部分未指出,此篇主要介绍Date/time部分以及Validation rules. 本篇参考PDF: Date/time:https://r ...
- salesforce零基础学习(九十四)classic下pagelayout引入的vf page弹出内容更新此page layout
我们在classic环境中,有时针对page layout不能实现的地方,可以引入 一个vf page去增强标准的 page layout 功能,有时可能要求这个 vf page的部分修改需要更新此 ...
- salesforce 零基础学习(五十二)Trigger使用篇(二)
第十七篇的Trigger用法为通过Handler方式实现Trigger的封装,此种好处是一个Handler对应一个sObject,使本该在Trigger中写的代码分到Handler中,代码更加清晰. ...
- salesforce零基础学习(八十二)审批邮件获取最终审批人和审批意见
项目中,审批操作无处不在.配置审批流时,我们有时候会用到queue,related user设置当前步骤的审批人,审批人可以一个或者多个.当审批人有多个时,邮件中获取当前记录的审批人和审批意见就不能随 ...
- salesforce零基础学习(八十九)使用 input type=file 以及RemoteAction方式上传附件
在classic环境中,salesforce提供了<apex:inputFile>标签用来实现附件的上传以及内容获取.salesforce 零基础学习(二十四)解析csv格式内容中有类似的 ...
- salesforce零基础学习(八十)使用autoComplete 输入内容自动联想结果以及去重实现
项目中,我们有时候会需要实现自动联想功能,比如我们想输入用户或者联系人名称,去联想出系统中有的相关的用户和联系人,当点击以后获取相关的邮箱或者其他信息等等.这种情况下可以使用jquery ui中的au ...
- salesforce 零基础学习(六十八)http callout test class写法
此篇可以参考: https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_classes_restfu ...
- salesforce零基础学习(一百一十)list button实现的一些有趣事情
本篇参考: salesforce零基础学习(九十五)lightning out https://developer.salesforce.com/docs/component-library/docu ...
随机推荐
- Coursera Robotics系列课心得
Robotics Perception Professor Kostas and Jianbo Shi week 1: camera model 凸透镜成像原理:凸透镜焦点与焦距是固定的,这是物理性质 ...
- spfa判断负环
会了spfa这么长时间竟然不会判断负环,今天刚回.. [例题]poj3259 题目大意:当农场主 John 在开垦他的农场时,他发现了许多奇怪的昆虫洞.这些昆虫洞是单向的,并且可以把你从入口送到出口, ...
- windows sdk编程 richedit创建,像十六进制编辑器一样显示文件
编译环境 :windows 7 64位 vs2010,工程创建选择"win32项目" 注意添加几个头文件 #include <WinBase.h> #include & ...
- MYSQL绿色安装过程
# These are commonly set, remove the # and set as required. basedir = "D:\Program Files\mysql-5 ...
- 用js写的比较简单3D旋转效果
HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...
- 安装 SSL 证书
http://www.itrus.cn/html/fuwuyuzhichi/fuwuqizhengshuanzhuangpeizhizhinan/
- 从头安装及配置PL/SQL Developer
原文地址:http://lightguide.blog.51cto.com/3121539/1140588 因为自己安装及配置中走了不少弯路,搜索网上的文档大部分没有包含oralce client的安 ...
- [转]Git - 重写历史
转自http://git-scm.com/book/zh/Git-%E5%B7%A5%E5%85%B7-%E9%87%8D%E5%86%99%E5%8E%86%E5%8F%B2 重写历史 很多时 ...
- C# 的析构
首先介绍下关于C#的GC垃圾回收器,有了这个垃圾回收器c#的开发人员可以不用像C++开发人员那样关心垃圾回收! 但是GC是把双刃剑,GC仅仅对于托管资源进行管理,对非托管资源却无能为力,并且C#的开发 ...
- Yii2中的零碎知识点
PHP最佳实践 1 PHP获取时间戳:echo time(); 时间戳转换 date('Y-m-d H:i:s', $时间戳); 2 linux 显示命令 ls 显示所有文件夹 查看命令:tail ...