Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >我的Web开发实战总结(二)

我的Web开发实战总结(二)

作者头像
wblearn
发布于 2018-08-27 09:36:04
发布于 2018-08-27 09:36:04
1.8K00
代码可运行
举报
文章被收录于专栏:wblearnwblearn
运行总次数:0
代码可运行

写在前面

这篇是继我的Web开发实战总结(一)的第二篇文章,在此篇里,我主要总结一下如何把Web页面上的报表或列表数据转换成pdf文件下载到本地。其中涉及到的知识我也会提出来供大家交流学习。ok,开始吧~

先来看看效果

Web页面上的列表数据

上图就是Web页面上的列表数据,将其右侧生成pdf之后的效果如下:

生成的pdf文件

实现思路

这里我提出两种实现思路:

1.利用Jacob将EXCEL转成PDF 2.利用iText将HTML 转为 PDF

1.利用Jacob将EXCEL转成PDF

一开始我用的这种思路,主要是因为有生成EXCEL的功能了,想着只要利用jacob再讲EXCEL转成PDF即可,但是后来放弃了。虽然jacob可以生成pdf,word,excel等,但经过本人的实操,问题多多,还要放dll文件到bin目录下。

首先,Dispatch.call(sheet,"Activate");指定活动sheet,这个是没有问题,设置哪一个就打哪一个,但是也只是当前的一个,其他的没有显示,对于有多个SHEET的EXCEL 怎么能这一次全部转到一个PDF上?实现是可以实现:遍历sheet保存多个pdf文件,通过itextpdf再将这多个PDF合成一个,不过效率偏低。

其次,jacob是对EXCEL中的每个单元格操作的,像上面的PDF中有图片读取很不方便,就算能打出图片也可能会很模糊,而且复杂的EXCEL更是无能为力。所以我建议大家使用第二种利用iText将HTML 转为 PDF,我也是用的第二种思路实现的。

2.利用iText将HTML 转为 PDF

这个思路就是我此篇要重点要讲的,将html转成PDF,首先html有图片,还有各种数据,那么怎么将图片和各种数据填充到html里面呢?这个问题非常好,有童鞋会说,将他们追加拼接到html里,我只想说:大兄弟,别呀,这样太蠢了。这里我们可以利用 freemarker,首先创建一个FreeMarker模板文件(.ftl),在这个文件中加入FreeMarker表达式,这些表达式就好比jsp中的jstl标签一样,我们在程序中将数据传递给此文件中即可,在客户端显示时会被真实的数据替换。*下面开始实现过程了。

利用iText将HTML 转为 PDF

1.准备好生成pdf所需的jar包

  • CORE 包:主要是itext相关的一些核心itext.jar
  • XML 包:xmlworker是一个基于iText的xml生成pdf工具
  • freemarker包:将模板转换成html的jar包(此jar包也能将模板转换成excel,word等)

这里我将它们打包免费分享出来,下载地址:itext生成pdf所需的jar包

2.创建ftl模板文件

创建一个FreeMarker模板文件(.ftl),在这个文件中加入FreeMarker表达式,这些表达式就好比jsp中的jstl标签一样,我们在程序中将数据传递给此文件中即可,在客户端显示时会被真实的数据替换。说白了,ftl模板文件就是在html里加入了FreeMarker表达式,所以里面的内容基本跟html一样,我们可以先创建html文件,修改完成后再将文件后缀改成.ftl即可。*本文.ftl模板如下:

arDraftBillPreview.ftl

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <#--ftl模板-->
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  </head>
  <#--一定要特别注意字体,很多字体部分中文不支持-->
  <body screen_capture_injected="true" ryt11773="1">
    <div id="header">
        <div>![](${imgPath})</div>
        <div id="text" sytle="font-size:30px;width:445px;height:45px;margin:0px auto;border:0px solid #ccc;"><p>STATEMENT OF ACCOUNT(Draft)</p></div>
    </div>

    <div>
        <table style="width: 90%;margin:0px auto;font-size:11px;">
        <tr>
            <td><font style="font-weight:bold">Customer:</font><span style="font-family:宋体">${data.name}</span></td>
            <td><font style="font-weight:bold">SOA#:</font>${data.number}</td>
            <td style="width: 2%;"></td>
            <td><font style="font-weight:bold">Currency:</font>${data.bill}</td> 
        </tr>
        <tr>
            <td><font style="font-weight:bold">Issud by:</font>UNI-TOP ALRLINES CO.,LTD</td>
            <td><font style="font-weight:bold">Period:</font>${data.stDate} ~ ${data.edDate}</td>
        </tr>
        </table>
    </div>
    <div>
     <table border="0" style="font-size:10px;text-align:center;border-collapse:collapse;">
        <tr style="background-color:#FDCDCB">
            <td style="border:1px solid #ccc;">NO</td>
            <td style="border:1px solid #ccc;">Flight Date</td>
            <td style="border:1px solid #ccc;">Flight No</td>
            <td style="border:1px solid #ccc;">Prefi x No</td>
            <td style="border:1px solid #ccc;">AWB NO</td>
            <td style="border:1px solid #ccc;">Origin</td>
            <td style="border:1px solid #ccc;">VIA</td>
            <td style="border:1px solid #ccc;">Dest</td>
            <td style="border:1px solid #ccc;">Gross Weight(KG)</td>
            <td style="border:1px solid #ccc;">Chargeable Weight(KG)</td>
            <td style="border:1px solid #ccc;">Unit Price</td>
            <td style="border:1px solid #ccc;">Air Freight Charge</td>
            <td style="border:1px solid #ccc;">Transfer Charge</td>
            <td style="border:1px solid #ccc;">Other Charge</td>
            <td style="border:1px solid #ccc;">Total</td>
            <td style="border:1px solid #ccc;">Other Charge Remark</td>
        </tr>
        <tr style="background-color:#FDCDCB">
            <td style="font-family:宋体;border:1px solid #ccc;">序号</td>
            <td style="font-family:宋体;border:1px solid #ccc;">航班日期</td>
            <td style="font-family:宋体;border:1px solid #ccc;">航班号</td>
            <td style="font-family:宋体;border:1px solid #ccc;">货单前缀</td>
            <td style="font-family:宋体;border:1px solid #ccc;">货单号</td>
            <td style="font-family:宋体;border:1px solid #ccc;">货源地</td>
            <td style="font-family:宋体;border:1px solid #ccc;">经停站</td>
            <td style="font-family:宋体;border:1px solid #ccc;">目的地</td>
            <td style="font-family:宋体;border:1px solid #ccc;">始发地()</td>
            <td style="font-family:宋体;border:1px solid #ccc;">结算重量</td>
            <td style="font-family:宋体;border:1px solid #ccc;">单价</td>
            <td style="font-family:宋体;border:1px solid #ccc;">空运费</td>
            <td style="font-family:宋体;border:1px solid #ccc;">国外转运费</td>
            <td style="font-family:宋体;border:1px solid #ccc;">其他杂费</td>
            <td style="font-family:宋体;border:1px solid #ccc;">共计</td>
            <td style="font-family:宋体;border:1px solid #ccc;">备注</td>
        </tr>

    <#list dataList as bill>  
          <tr>  
                    <td style="border:1px solid #ccc;">${bill.no}</td>  
                    <td style="border:1px solid #ccc;">${bill.flightDate}</td>  
                    <td style="border:1px solid #ccc;">${bill.flightNo}</td>  
                    <td style="border:1px solid #ccc;">${bill.prefixNo}</td>  
                    <td style="border:1px solid #ccc;">${bill.aWBNO}</td> 
                    <td style="border:1px solid #ccc;">${bill.origin}</td> 
                    <td style="border:1px solid #ccc;"></td> 
                    <td style="border:1px solid #ccc;">${bill.dest}</td> 
                    <td style="border:1px solid #ccc;">${bill.grossWeight}</td> 
                    <td style="border:1px solid #ccc;">${bill.chargeableWeight}</td> 
                    <td style="border:1px solid #ccc;">${bill.unit}</td> 
                    <td style="border:1px solid #ccc;">${bill.airFreightCharge}</td>  
                    <td style="border:1px solid #ccc;">${bill.transferCharge}</td>  
                    <td style="border:1px solid #ccc;">${bill.otherCharge}</td>  
                    <td style="border:1px solid #ccc;">${bill.total}</td>  
                    <td style="font-family:宋体;border:1px solid #ccc;">${bill.remark!}</td>  
           </tr>
    </#list>
    <#if total??>  
           <tr>  
                    <td style="border:1px solid #ccc;"></td>  
                    <td style="border:1px solid #ccc;"></td>  
                    <td style="border:1px solid #ccc;"></td>  
                    <td style="border:1px solid #ccc;"></td>  
                    <td style="border:1px solid #ccc;"></td> 
                    <td style="border:1px solid #ccc;"></td> 
                    <td style="border:1px solid #ccc;"></td> 
                    <td style="font-family:宋体;color:red;border: 1px solid #ccc;">总计:</td> 
                    <td style="color:red;border:1px solid #ccc;">${total.grossWeight}</td> 
                    <td style="color:red;border:1px solid #ccc;">${total.chargeableWeight}</td> 
                    <td style="color:red;border:1px solid #ccc;"></td> 
                    <td style="color:red;border:1px solid #ccc;">${total.airFreightCharge}</td>  
                    <td style="color:red;border:1px solid #ccc;">${total.transferCharge}</td>  
                    <td style="color:red;border:1px solid #ccc;">${total.otherCharge}</td>  
                    <td style="color:red;border:1px solid #ccc;">${total.total}</td>  
                    <td style="color:red;border:1px solid #ccc;"></td>  
            </tr>
    </#if>  
        </table>
        </div>
  </body>
</html>

以上代码在myeclipse中预览的效果如下:

注意:如果使用不存在的freemarker指令,FreeMarker不会使用模板输出,而是产生一个错误消息。其次,在写ftl模板的时候,因为xmlworker支持的CSS样式极少,所以模板内容要尽量简单。对于DOCTYPE和html标签的约束页比较严格。对于一个标签中含有中文、数字或英文的时候,很可能会出现问题。这是因为xmlworker在渲染PDF的时候是以html的标签为单位的。我发现有些字体下部分中文生成pdf不会显示。另外,对于freemarker模板语言不熟悉的童鞋,我会在文末贴出一些参考资料。

3.向ftl模板文件中填充数据,同时将其生成html

在业务处理层,将数据传递个ftl ,同时解析ftl模板生成html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//将需要在客户端浏览器中显示的业务数据放在一个map中,传递给FreeMarker   
                Map<String, Object> map = new HashMap<String, Object>();  
                map.put("imgPath", imgPath);
                map.put("data",data);
                map.put("dataList", dataList);  
                map.put("total", total);  
                TemplateParseUtil.parse(templatePath, "arDraftBillPreview.ftl", htmlPath, map);

解析ftl模板生成html(此方法与生成Excel,xml等通用),这里我写了一个工具类

TemplateParseUtil.java

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class TemplateParseUtil {
    /**
     * 解析模板生成html(此方法与生成Excel,xml等通用)
     * @param templateDir  ftl模板目录
     * @param templateName ftl模板名称
     * @param htmlPath 生成的html文件路径
     * @param data 数据参数
     * @throws IOException
     * @throws TemplateException
     */
    public static void parse(String templateDir,String templateName,String htmlPath,Map<String,Object> data) throws IOException, TemplateException {
        //初始化工作
        Configuration cfg = new Configuration();
        //设置默认编码格式为UTF-8
        cfg.setDefaultEncoding("UTF-8"); 
        //全局数字格式
        cfg.setNumberFormat("0.00");
        //设置模板文件位置
        cfg.setDirectoryForTemplateLoading(new File(templateDir));
        cfg.setObjectWrapper(new DefaultObjectWrapper());
        //加载模板
        Template template = cfg.getTemplate(templateName,"utf-8");
        OutputStreamWriter writer = null;
        try{
            //填充数据至html
            writer = new OutputStreamWriter(new FileOutputStream(htmlPath),"UTF-8");
            template.process(data, writer);
            writer.flush();
        }finally{
            writer.close();
        }   
    }
}

4.利用itext将生成的html渲染生成PDF

步骤基本如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 // 1.新建document对象
        Document document = new Document();
// 2.建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
// 创建 PdfWriter 对象 第一个参数是对文档对象的引用,第二个参数是文件的实际名称,在该名称中还会给出其输出路径。
        PdfWriter writer = PdfWriter.getInstance(document, new       FileOutputStream("D:/test.pdf"));
// 3.打开文档
        document.open();
 // 4.添加一个内容段落
      document.add(new Paragraph("Hello World!"));
 // 5.关闭文档
     document.close();

本文中的利用itext生成PDF的代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
                Document document = new Document(PageSize.A4, 10, 50, 10, 50);
                // step 2
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(servletPath+DEST));
                // step 3
                document.open();
                // step 4
                XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                        new FileInputStream(htmlPath), Charset.forName("UTF-8"));
                // step 5
                document.close();

5.完整处理逻辑

可能写到这里代码有点分散,这里将上面3、4步骤的代码完整逻辑贴出来,让大家看的清晰明白点:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
     * 
     * 草稿账单pdf导出
     */
    @RequestMapping("/exportPDFDraftPreview")
    public @ResponseBody ControllerResult<?> exportPDFDraftPreview(HttpServletRequest request, HttpServletResponse response) throws Exception {
        ExecuteController e = new ExecuteControllerHandle() {
            @Override
            public ControllerResult<?> dowith(HttpServletRequest request,HttpServletResponse response, Object... params) throws Exception {
                /**
                 * 具体导出步骤:先查询出具体的表头信息,然后再查询出具体的列表数据。最后整合放在具体的类里
                 */
                // 请求参数绑定
                DraftBillResponse info = ControllerUtils.bindParams(request,DraftBillResponse.class);//返回一个草稿账单号
                info.setMoneytype(info.get币种());
                DraftBill topInfo = new DraftBill();
                topInfo.set币种(info.get币种());
                topInfo.set草稿账单编号(info.get草稿账单编号());
                // 业务层调用
                IFinancialManagementMgr mgr = FinancialManagementFactory.createIFinancialManagementMgrMgrImpl();
                
                List<DraftBill> bill =  mgr.queryManuscriptPreview(topInfo);//查询表头
                
                List<DraftBillResponse> list = mgr.queryDraftPreview(info); //查询列表数据
                
                        
                String servletPath = request.getSession().getServletContext().getRealPath("/");//请求的服务器
                String templatePath = servletPath+"template";//模板目录
                String htmlPath = servletPath+"tempFile\\"+info.get草稿账单编号()+".html";//生成的html地址
                String imgPath = servletPath+"images\\exlTop.png";//模板中的图片
                String DEST = "tempFile\\"+info.get草稿账单编号()+".pdf";//将要生成的pdf
                
                
                /*DraftBill data = new DraftBill();
                data = bill.get(0);*/
                //进行英文转换,防止无法识别
                
                List<BillList>  dataList = new ArrayList<BillList>();
                BillList listData = null;
                BillList total = new BillList();
                BillExport data = new BillExport(bill.get(0).get代理人(),bill.get(0).get草稿账单编号(),bill.get(0).get币种(),bill.get(0).get账单周期起(),bill.get(0).get账单周期止());
                
                double num1 = 0,num2 = 0,num3 = 0,num4 = 0,num5 = 0,num6 = 0;  //地重,始发重量,空运费,转运费,杂费,共计
                   
               
                for(DraftBillResponse res : list){//集合
                  
                  double 地重 =   Double.valueOf(res.get始发地重量());  //设置统计数据
                  double 始发重 =  Double.valueOf(res.get结算重量());
                  double 空运费 =  Double.valueOf(res.get运费());
                  double 转运费 =  Double.valueOf(res.get国外联运费());
                  double 杂费 =   Double.valueOf(res.get杂费());
                  double 统计 =   Double.valueOf(res.get运费())+ Double.valueOf(res.get国外联运费())+Double.valueOf(res.get杂费());
                  num1 = num1 + 地重;
                  num2 = num2 + 始发重;
                  num3 = num3 + 空运费;
                  num4 = num4 + 转运费;
                  num5 = num5 + 杂费;
                  num6 = num6 + 统计;
                    listData = new BillList(res.get序号(), res.get航班日期(), res.get航班号(), res.get货单前缀(),  //设置列表数据
                            res.get货单号(), res.get货源地(), "", res.get目的站(), res.get始发地重量(),
                            res.get结算重量(), res.get空运费费率(), res.get运费(), 
                            res.get国外联运费(),res.get杂费(), String.valueOf(CommonUtil.toDecimalFormat(统计)),
                            res.get备注());
                    
                    dataList.add(listData);
                }
                
                //将统计的数据放进实体
                total.setGrossWeight(String.valueOf(CommonUtil.toDecimalFormat(num1)));
                total.setChargeableWeight(String.valueOf(CommonUtil.toDecimalFormat(num2)));
                total.setAirFreightCharge(String.valueOf(CommonUtil.toDecimalFormat(num3)));
                total.setTransferCharge(String.valueOf(CommonUtil.toDecimalFormat(num4)));
                total.setOtherCharge(String.valueOf(CommonUtil.toDecimalFormat(num5)));
                total.setTotal(String.valueOf(CommonUtil.toDecimalFormat(num6)));
                
              //将需要在客户端浏览器中显示的业务数据放在一个map中,传递给FreeMarker   
                Map<String, Object> map = new HashMap<String, Object>();  
                map.put("imgPath", imgPath);
                map.put("data",data);
                map.put("dataList", dataList);  
                map.put("total", total);  
                TemplateParseUtil.parse(templatePath, "arDraftBillPreview.ftl", htmlPath, map);
               
                Document document = new Document(PageSize.A4, 10, 50, 10, 50);
                // step 2
                PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(servletPath+DEST));
                // step 3
                document.open();
                // step 4
                XMLWorkerHelper.getInstance().parseXHtml(writer, document,
                        new FileInputStream(htmlPath), Charset.forName("UTF-8"));
                // step 5
                document.close();
                
                return ControllerUtils.buildSimpleResult(true, DEST);
            }
        };

在上面的程序中,包括PDF上的图片,表头及表身数据都传给ftl模板中了,在生成PDF之前,都会先生成一个.html的文件到tempFile的文件夹下,如下:

写在最后

其实整个过程都比较简单,难就难在一开始你不知道用那种方式去实现,这种时候我建议你都试试,毕竟一个东西你试过之后才知道好不好,适不适合。还有一点就是,对于你不知道的东西,网上一般都有很多参考资料,一定要善于利用搜索引擎学习。关于学习,就三点:坚持,坚持,坚持。

下面列出一些相关链接供大家参考:

iText入门

动态jsp页面转PDF输出到页面

最简单 iText 的 PDF 生成方案(含中文解决方案)HTML 转为 PDF

ftl 入门

Freemarker 最简单的例子程序

FreeMarker 例子

freemarker生成excel、word、html、xml实例教程

freemarker判断对象是否为空

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.26 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大二级分类产品页权重低,不收录怎么办?
典型树形结构首页链接到一级分类,一级分类页面再列出二级分类,这样,只要二级分类数目相差不太悬殊,权重值在二级分类页面上是大致平均分配的。
茹莱神兽
2022/07/07
4030
大二级分类产品页权重低,不收录怎么办?
浅谈网站重点内页的权重分配及优化思路
重点内页某些情况或某个时段上可能是网站主推的核心产品服务,基于此,在展示或者内链优化都有一定的倾向,SEO在进行网站结构和内链优化时,可能会着重考虑主推产品或专题也的优先权重分配及排名。
茹莱神兽
2022/06/19
4610
浅谈网站重点内页的权重分配及优化思路
网站导航设计与站内链接优化汇总
网页导航表现为网页的栏目菜单设置、辅助菜单、其他在线帮助等形式。网页导航设置是在网页栏目结构的基础上,进一步为用户浏览网页提供的提示系统,由于各个网页设计并没有统一的标准,不仅菜单设置各不相同,打开网页的方式也有区别,有些是在同一窗口打开新网页,有些在新打开一个浏览器窗口。
茹莱神兽
2022/02/01
1.4K0
网站导航设计与站内链接优化汇总
网站SEO诊断分析应该从哪方面入手?
网站SEO诊断是针对网站是否利于搜索引擎搜索、是否利于浏览和给浏览者美好的交互体验以及是否利于网络营销的一种综合判断行为,网站主要看打开速度和用户体验度。SEO推广人员的本质工作是围绕网站来展开,网站的优化效果好不好,离不开SEO诊断分析,如何对网站进行SEO诊断分析呢?
茹莱神兽
2022/01/21
6840
网站SEO诊断分析应该从哪方面入手?
百度不收录,可能与网站的病态内链接有关
自从2021年4月百度批量整顿了3.8亿个网站之后,网站的收录速度明显下降了,很多网站关键词排名呈断崖式下跌,这是一场互联网浩劫。对于网站收录慢或者不收录现象,百度官方给的说法是,采集站、文章伪原创、与网上部分内容重合都是影响搜索引擎收录的因素。
茹莱神兽
2022/01/04
5410
百度不收录,可能与网站的病态内链接有关
如何降低用户关注的非必要页面的权重传递?
每个网站都有一些在功能及用户体验方面很有必要、但在SEO角度没有必要的页面,比如隐私政策、用户登陆页面、用户注册页面、联系我们、甚至还包括“关于我们”页面。
茹莱神兽
2022/06/28
3670
如何降低用户关注的非必要页面的权重传递?
大中型网站列表页翻页过多怎么优化?
稍大型的商务或信息类网站都可能会在产品列表,也就是最末一级的分类页面上,存在翻页过多的问题。通常产品列表会显示10个或20个产品,然后列出翻页链接,除了“上一页”和“下一页”,网站可能列出5个、10个翻页链接。
茹莱神兽
2022/08/01
8300
大中型网站列表页翻页过多怎么优化?
如何做好单个关键词的排名优化?
接触过SEO外包公司的人都知道,单个关键词排名优化问题实际上是外包公司的核心业务。SEO盛行时代,SEO外包公司其实就是做关键词优化排名的,10个人左右,接单中小企业网站,主要优化的是首页关键词,3-5个关键词,一个个突击,从易到难,优化方法是从内到外,以下整理单个关键词排名优化方法作为参考。
茹莱神兽
2021/09/24
4300
如何做好单个关键词的排名优化?
什么是符合搜索引擎友好的网站设计?
如果我们从搜索引擎蜘蛛的角度去看一个网站,在抓取、索引和排名时会出现一系列问题,解决了这些问题的网站设计就是对搜索引擎友好的网站。
茹莱神兽
2022/04/03
4840
什么是符合搜索引擎友好的网站设计?
网站最终产品页使用单一入口还是多入口?
一般来说,网站的首页和分类页面收录不会有什么问题,除非在主导航有严重的蜘蛛陷阱,或网站已经被惩罚。大部分网站在结构方面面对的挑战,是使更多最终产品页面被收录。
茹莱神兽
2022/08/05
9660
网站最终产品页使用单一入口还是多入口?
SEO如何建立优化网站关键词词库?
建立关键词词库,是SEO优化工作非常重要的事情。高权重的网站,必然需要强大的关键词库支持。实际上,网站权重的提升是一个增加网站词汇的过程。但大部分SEO人员,却没有合理的规划关键词库,甚至连最基本的Excel表格都没有,实际上这是一种盲目而又随意的行为。
茹莱神兽
2020/11/16
2.1K0
SEO如何建立优化网站关键词词库?
SEO操作不当,造成网站页面重复,如何解决?
网站重复内容页面过多会造成资源和精力的浪费、关键词的内部竞争,还会分散权重,得不偿失。若是因为站内重复内容页面过多被搜索引擎误判为采集站就麻烦了。
茹莱神兽
2022/06/07
5630
SEO操作不当,造成网站页面重复,如何解决?
网站筛选功能页面不收录,还有优化的必要么?
网站信息筛选功能页面是网站因为网页过多,数据过于庞大,为了方便用户浏览和查询所需要的信息而制作出来的多个条件的功能页面,目的是让用户能够快速通过筛选条件找到想要的内容。
茹莱神兽
2022/03/13
7760
网站筛选功能页面不收录,还有优化的必要么?
个人博客网站如何做好SEO优化?
做网站不懂SEO其实是件很可怕的事情,好的SEO会对网站建设起到事半功倍的效果。相反,如果不懂,只是胡乱操作也会给自己带来众多困扰,网站seo优化的目标就是提升网站关键词的排名,帮助企业获得知名度以及更高的利益。
茹莱神兽
2022/02/11
1.8K0
个人博客网站如何做好SEO优化?
影响站内SEO关键词排名优化的几个因素
网站站内优化对于关键词排名优化工作来讲无疑是最重要的一部分,只有做好站内优化才能更加快速有效的提升排名。很多SEO在网站内部没有优化好之前就匆忙上线,上线之后又觉得关键词不合理、网站结构不合理,总之是喜欢在线反复调整。搜索引擎对这类网站降低印象分,会影响日后的SEO优化。
茹莱神兽
2021/05/22
6650
影响站内SEO关键词排名优化的几个因素
怎样判断网站超链接的相关性呢?
任何行业都有权威网站作为整个行业的先行者,他们的最新动态便是这个圈内的权威,是大家关注的重点,同时也会影响这个行业的整体格局。网站要进行SEO推广,依托行业权威网站作为介质推荐网站,从而能快速达到好的排名获取订单转化,这便是网站SEO外链相关性带来的好处。
茹莱神兽
2022/01/22
7510
怎样判断网站超链接的相关性呢?
浅谈网站导航系统中锚文字的分布及变化
合理的网站结构实在网站中分配锚文字的重要方法之一。最灵活常见的是在页面正文中或人工或自动加上其他页面的内部链接,链接锚文字可以有各种选择,这方面的应用学习目标非维基百科莫属。
茹莱神兽
2022/08/15
3530
浅谈网站导航系统中锚文字的分布及变化
怎么让百度快速收录自己的个人网站?
网站收录是每个SEO都要面临的问题,SEO站长建立了自己的个人博客网站,就需要让网站被搜索引擎快速收录,但是百度对于新站收录是非常缓慢的,如何才能做到让百度快速收录自己的个人网站呢?
茹莱神兽
2021/06/03
2.8K0
怎么让百度快速收录自己的个人网站?
从网站结构出发,提升搜索引擎的友好度
搜索引擎爬取网站内容都是从网站的结构出发,为了提升搜索引擎的友好的,优化网站结构是重点。和对待用户一样,对待搜索引擎也需要投其所好,才能获取它的友好度。 1、div+css合理的布局 div+css布局的网站代码比较精简,加载的速度也快,能狙击搜索引擎的喜好,网站的收录和排名也会高。不过div+css布局的网站,一定要控制好flash、JavaScript等特效的使用,就算是使用也不要太冗长。尽管这些特效能给用户带来一定的享受,但是会严重拉长网站的加载速度,还没加载出来,蜘蛛就会放弃爬取你的网站了。
企鹅号小编
2018/02/02
7310
从网站结构出发,提升搜索引擎的友好度
子域名和目录,那个适合做SEO优化?
子域名和目录都有各自的优缺点,或许在某种特定情况下,谁都不占优势。从SEO角度看,目录比子域名更容易优化;但当公司的多个产品形成一定的品牌后,子域名比目录适合,具体情况具体分析。
茹莱神兽
2022/04/13
1K0
子域名和目录,那个适合做SEO优化?
推荐阅读
相关推荐
大二级分类产品页权重低,不收录怎么办?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验